这是C/C++中的未定义行为(第2部分)

jay*_*aya 2 c c++ undefined-behavior

有关序列点的规则对以下代码有何规定?

int main(void) {
    int i = 5;
    printf("%d", ++i, i); /* Statement 1 */
}
Run Code Online (Sandbox Code Playgroud)

只有一个%d.我很困惑,因为我在编译器GCC,Turbo C++和Visual C++中获得了6个输出.行为是明确界定还是什么?

这与我的上一个问题有关.

pmg*_*pmg 7

由于以下两个原因,它未定义:

  1. 值的i两次没有插入序列点(参数列表中的逗号不是逗号运算符,也不引入序列点).

  2. 你在没有范围原型的情况下调用可变函数.

  3. 传递给的参数数量printf()与格式字符串不兼容.

  4. 默认输出流通常是行缓冲的.如果没有'\n',则无法保证输出有效输出.


Bjö*_*lex 6

调用函数时会调用所有参数,即使它们未被使用,因此,由于函数参数的计算顺序未定义,因此再次使用UB.