我在True和False之间感到困惑.真值是否代表零,虚值代表零?

Sco*_*pio 1 c

为什么在比较操作完成后,下面的程序给出了相反的答案?

main()
{
    int k=35;
    printf("%d\n%d\n%d",k==35,k=50,k<40); 
}
Run Code Online (Sandbox Code Playgroud)

产量

0 50 1

Alo*_*ave 8

根据C标准,该程序不是有效的C程序.
这个程序有2个问题.

问题1:未指定的行为

函数参数的评估顺序是Unspecified [Ref 1].

  • 它可以是从左到右
  • 它可能是向右或向右
  • 任何其他神奇的命令

问题2:未定义的行为

这具有未定义的行为[参考文献2],因为在没有插入序列点的情况下,不应多次修改变量.注意,,在函数参数中没有引入序列点.因此,k在没有插入序列点的情况下进行修改并导致未定义的行为.

因此,在这种情况下,您不能依赖该行为.该程序不是有效的C程序.


[参考1]
C99标准6.5.2.2.10:

函数指示符的评估顺序,实际参数和实际参数中的子表达式是未指定的,但在实际调用之前有一个序列点.

[参考2]
C99标准6.5.2:

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,只能访问先前值以确定要存储的值.


请注意,Unspecified和Undefined Behavior是标准定义的术语:

C99标准3.19未指明的行为:

本国际标准提供两种或更多种可能性并且在任何情况下都没有选择要求的行为

C99标准3.18未定义的行为:

使用不可移植或错误的程序构造时,对于错误数据或不确定值的对象的行为,本国际标准不对此要求