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"));

运行没有错误,但第四行(见下文):

    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

就像在数学中一样,函数调用中的括号被解释为分组:eg(1) * (2)与 相同1 * 2,但(1 + 2) * 3与 不同1 + 2 * 3

在第一个示例aaa(("abc"))中:首先计算内括号,但("abc")与 相同"abc",因此这等效于仅调用aaa("abc");

在第二个例子aaa(("abc",3))中:内部表达式是("abc", 3)ie逗号操作符开始起作用并被丢弃,作为 的参数"abc"离开。编译器抱怨因为没有类型所以你没有正确调用函数。3aaa3intchar*

于 2012-04-16T13:19:50.310 回答
1

因为传递给函数的参数是("%dabc", 3)它本身调用逗号运算符并返回的值3

于 2012-04-16T13:15:27.043 回答
1

左值(“xxx”,val)计算“xxx”,然后计算val并得出括号中的最后一个值,即val。aaa(...) 中的括号是参数。

于 2012-04-16T13:13:59.127 回答