函数调用的双括号?

时间:2012-04-16 13:09:49

标签: c gcc syntax

请考虑以下代码:

#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 个答案:

答案 0 :(得分:12)

声明

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

使用参数aaa调用函数("%dabc", 3),该参数返回值3

查看comma operator以获取更多信息。

答案 1 :(得分:2)

与数学一样,函数调用中的括号被解释为分组:例如(1) * (2)1 * 2相同,但(1 + 2) * 31 + 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的值。