在函数调用中,为什么逗号不是序列点?

kau*_*ray 4 c undefined-behavior sequence-points

在以下代码中

int main(){  
    int a=3;  
    printf("%d %d %d",++a,a,a++);
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

按照规定,从C99附录C:,

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

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

计算函数参数的顺序是未定义的,如C标准所指定.

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

P.P*_*.P. 12

因为逗号函数调用是不是逗号操作符,但一个分隔符.所以它没有引入任何序列点.

  • 换句话说,语言规范允许*逗号*具有不同的行为.你也可以问((以及许多类似的问题)为什么使用*乘法运算符*`*来取消引用指针(例如`*p = 5;`:) (5认同)
  • @kevin逗号没有"表现".它是*在语法规则中出现*的符号.当您使用函数调用语法时,参数之间的逗号是分隔的标点符号.在逗号表达式中,逗号表示运算符.所以它取决于你正在编写的东西遵循哪种语法规则. (4认同)
  • @kevin,例如separator`int x [] = {1,2,3}`,`call(1,2,3)`; 序列点:`int x [] = {(1,/*逗号op*/2),/*分隔符*/3}`,`call((1,/*逗号op*/2),/*分隔符*/3)`. (2认同)