5

次のコードを検討してください。

#include <stdio.h>

int aaa(char *f, ...)
{
    putchar(*f);    
    return 0;
}

int main(void)
{
    aaa("abc");
    aaa("%dabc", 3); 
    aaa(("abc"));
    aaa(("%dabc", 3));
    return 0;
}

なぜ次の行なのか疑問に思いました。

    aaa("abc");
    aaa("%dabc", 3); 
    aaa(("abc"));

エラーなしで実行されますが、4行目(以下を参照):

    aaa(("%dabc", 3));

次のエラーが生成されます。

main.c:15:2:警告:「aaa」の引数1を渡すと、キャストなしで整数からポインターが作成されます

main.c:3:5:注:「char *」が必要ですが、引数は「int」型です。

4

4 に答える 4

13

ステートメント

aaa(("%dabc", 3));

値を返すaaa引数を使用して関数を呼び出します。("%dabc", 3)3

詳細については、コンマ演算子を検索してください。

于 2012-04-16T13:12:44.023 に答える
2

数学の場合と同様に、関数呼び出し内の括弧はグループ化として解釈されます。たとえば、はと同じ(1) * (2)ですが、1 * 2(1 + 2) * 3は異なり1 + 2 * 3ます。

最初の例aaa(("abc"))では、内側の括弧が最初に評価されますが("abc")、と同じ"abc"であるため、これは単に。を呼び出すことと同じaaa("abc");です。

2番目の例aaa(("abc",3))では、内部式は次のようになります。("abc", 3)つまり、コンマ演算子が機能し"abc"、破棄3され、引数として。に残されますaaa3intがないため、コンパイラが文句を言っているためchar*、関数を正しく呼び出していません。

于 2012-04-16T13:19:50.310 に答える
1

左辺値( "xxx"、val)は、 "xxx"、次にvalを評価し、結果は括弧内の最後の値、つまりvalになります。aaa(...)の括弧はパラメーターです。

于 2012-04-16T13:13:59.127 に答える
1

関数に渡されるパラメーターは、("%dabc", 3)それ自体がコンマ演算子を呼び出し、の値を返すためです3

于 2012-04-16T13:15:27.043 に答える