请考虑以下代码:
#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'
答案 0 :(得分:12)
答案 1 :(得分:2)
与数学一样,函数调用中的括号被解释为分组:例如(1) * (2)
与1 * 2
相同,但(1 + 2) * 3
与1 + 2 * 3
不同。
在第一个示例aaa(("abc"))
中:首先评估内部括号,但("abc")
与"abc"
相同,因此这相当于只调用aaa("abc");
。< / p>
在第二个示例aaa(("abc",3))
中:内部表达式为("abc", 3)
,即comma operator开始播放,"abc"
被丢弃,3
作为参数到aaa
。编译器抱怨,因为3
的类型int
不是char*
,因此您没有正确调用该函数。
答案 2 :(得分:1)
左值(“xxx”,val)计算“xxx”,然后计算val并得到括号中的最后一个值,即val。 aaa(...)中的括号是参数。
答案 3 :(得分:1)
因为传递给函数的参数是("%dabc", 3)
,它本身调用逗号运算符并返回3
的值。