在函数调用中,为什么不能使用序列点?

时间:2016-01-22 16:12:58

标签: c undefined-behavior sequence-points

在以下代码中

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

答案 0 :(得分:12)

因为函数调用中的逗号而不是 comma operator而是分隔符。所以它没有引入任何序列点。