2016-01-22 95 views
4

在下面的代码在函数调用中,为什么逗号不是序列点?

int main(){ 
    int a=3; 
    printf("%d %d %d",++a,a,a++); 
    return 0; 
} 

作为指定,从C99附录C:

以下是5.1.2.3中描述的序列点:

  • 给函数的调用,在参数评估后 (6.5.2.2)。
  • 以下操作符的第一个操作数的结尾:逻辑 AND & &(6.5.13);逻辑OR || (6.5.14);有条件? (6.5.15); 逗号(6.5.17)

函数参数的求值顺序未定义,如C标准所指定。

但是,在printf的函数调用中,我们有用逗号分隔的参数,它们被分类为序列点。那么为什么这个陈述对应于未指定的行为呢?

+1

要清楚的是:'printf'调用中的这些逗号是* not *顺序点,并且它们当然不会赋予明确未定义的'a ++'和'++ a'组合上的任何明确定义。 –

回答

12

因为逗号在函数调用comma operator分离。所以它不会引入任何序列点。

+0

逗号操作符何时起到分隔符的作用?它何时表现为序列点? –

+2

@kevin,例如分隔符'int x [] = {1,2,3}','call(1,2,3)';序列点:'int x [] = {(1,/ * comma op */2),/ * separator */3}','call((1,/ * comma op */2)/3)'。 – kay

+4

@kevin逗号不“表现”。它是语法规则中出现*的符号。当您使用函数调用语法时,参数之间的逗号是分隔符的标记符号。在逗号表达式中,逗号表示运算符。所以这取决于你正在写的东西遵循哪个语法规则。 – Kaz

相关问题