#include <stdio.h>
int main()
{
int a = 10;
if (a == a--)
printf("TRUE 1\t");
a = 10;
if (a == --a)
printf("TRUE 2\t");
}
为什么第二个if语句是真的?
输出是: TRUE 1 TRUE 2
这是否由于未定义的行为而发生,因为我将相同的变量与其递减的值进行比较?
答案 0 :(得分:12)
正确,条件评估为true
,因为您看到未定义的行为:如果在表达式中使用具有副作用的运算符的变量,则在具有副作用的表达式中再次使用相同的变量是非法的没有序列点(==
没有序列点)。
这是因为只要在计算表达式时使用的值是正确的(即递减之前的值),编译器就可以随时应用--
的副作用。后缀表示法,或前缀表示法减量后的值。)
答案 1 :(得分:-3)
a--
递减a
,有效地意味着计算a == a
时,它是10 == 10
,这是真的。
--a
在表达式计算之前递减a
,实际意味着在实际计算a == a
时,a已经递减,所以它是9 == 9
,这又是真的
前后递减不能在表达式中间发生。它们发生在它们之前或之后。
答案 2 :(得分:-3)
这是因为 == 运算符的关联性是从左到右。
a==a--
在这个表达式中,首先比较双方(10 == 10),然后a减少到9
a==--a
在这个表达式中,首先a的值减少到9然后与 a (已经变为9)进行比较
所以,两者都是真的。