【问题标题】:Why the expression a==--a true in if statement? [duplicate]为什么 if 语句中的表达式 a==--a true? [复制]
【发布时间】:2014-02-16 11:53:51
【问题描述】:
    #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 语句为真?

输出是: 对 1 对 2

这是由于未定义的行为,因为我将同一个变量与其递减值进行比较吗?

【问题讨论】:

  • 有效问题。另一方面:不要编写明显不正确的代码。将代码压缩为尽可能少的行不是目标。
  • 与其发帖问这个问题,我认为如果你将它编译成汇编并检查输出,你会学到更多。 (如果您也在调试器中运行它,您可能可以检查正常编译的程序集输出。)
  • 严重错误(不正确!)标题。

标签: c post-increment pre-increment


【解决方案1】:

正确,条件计算结果为true,因为您看到未定义的行为:如果在表达式中使用具有副作用的运算符的变量,则在没有序列的表达式中再次使用相同的变量是非法的点(== 没有序列点)。

这是因为编译器可以在任何时候随意应用-- 的副作用,只要在评估表达式时使用的值是正确的(即后缀符号减量之前的值) , 或前缀符号减量后的值)。

【讨论】:

  • 而GCC 4.8 用gcc -Wall 警告你两次...... CLANG 3.4 也是如此
  • 在没有序列点的单个表达式中多次使用同一个变量是非法的 这是不正确的。您可以在没有序列点的表达式中多次使用变量。代码的问题在于先前的值不仅仅用于确定要存储的新值。 a + a + a + a 有效;你的回答表明它是无效的。
  • @FilipeGonçalves 啊,当然 - 我应该提到一个有副作用的运算符。不错的收获 - 非常感谢!
【解决方案2】:

a-- 在表达式求值后递减a,实际上意味着在计算a == a 时,它是10 == 10,这是真的。

--a 在表达式计算之前递减a,实际上意味着在实际计算a == a 时,a 已经递减,所以它是9 == 9,这又是真的。

前后减量不能发生在表达式中间。它们发生在它们之前或之后。

【讨论】:

  • c&p 错误:你只做后期递减
【解决方案3】:

这是因为 == 运算符的关联性是从左到右。

a==a--

在这个表达式中,首先将两边进行比较(10==10),然后将a减少到9

a==--a 

在这个表达式中,a 的值首先减少到 9,然后与 a(已变为 9)进行比较

所以,两者都是真的。

【讨论】:

  • 不,由于缺少序列点,此代码会调用未定义的行为。关联性告诉您表达式的含义,而不是评估的顺序。
猜你喜欢
  • 2015-07-28
  • 2015-07-29
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多