使用比较变量作为参数解释printf

Him*_*hik -2 c undefined-behavior sequence-points

main(){
    int a = 5;
    int b = 6;
    printf("%d %d %d",a==b,a=b,a<b);
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中输出

1 6 1

在上面的程序中,我期望输出为0 6 0.在一些编译器中,它给出了这个输出(例如Xcode),但在某些其他编译器中,它输出为1 6 1.我找不到解释.这也是序列点的情况.

考虑以下计划

main(){
    int a = 5;
    int b = 6;
    printf("%d %d %d",a<b,a>b,a=b);
    printf("%d %d",a<=b,a!=b);
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中输出

0 0 6 1 0

这个下面的程序正在给出正确的输出,我期待的是0 0 6 1 0但是为什么上面的程序在大多数编译器中没有给出输出060

hac*_*cks 6

C标准说:

C11:6.5(第2页):

如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义 [...]

这意味着您的程序调用未定义的行为.在声明中

printf("%d %d %d",a==b,a=b,a<b);  
Run Code Online (Sandbox Code Playgroud)

printf("%d %d %d",a<b,a>b,a=b);
Run Code Online (Sandbox Code Playgroud)

a因为标准说:副作用是 无效的