为什么此代码打印第二个声明?

时间:2016-09-30 07:05:58

标签: c

为什么此代码在第一个If语句中失败?

根据协会和优先顺序,我的预测出错了。

 #include<stdio.h>

    void main()
    {
            int i=10;
            if(i==i--)
            {
                printf("In 1:%d\n",i);
                printf("TRUE 1\n");
            }   
            i=10;
            if(i==--i)
            {
                printf("In 2:%d\n",i);
                printf("TRUE 2\n");
            }
    }               

5 个答案:

答案 0 :(得分:3)

i==i--是未定义的行为。请检查:http://c-faq.com/expr/ieqiplusplus.html和此:http://c-faq.com/expr/seqpoints.html

答案 1 :(得分:2)

表达式i==i--将导致未定义的行为,因为ii--的两个评估之间没有序列点。这意味着任何事情都可能发生,此时程序不再产生有意义的输出。

表达式i==--i

也是如此

如果读取并修改了对象而没有将两个事件分开的序列点,则行为未定义 1 。在这种情况下,相同的对象被修改(副作用):i--和读取(值计算):i,没有序列点。

正确的代码会将两个表达式与一个序列点(字符;)分开:

const int i1 = i;
const int i2 = i--;
if( i1 == i2 )
{
    //...
}


const int i3 = i;
const int i4 = --i;
if( i3 == i4 )
{
    //...
}

1 (引自ISO / IEC 9899:201x 6.5表达式2):
如果相对于不同的副作用,对标量对象的副作用是无效的 在相同的标量对象上或使用相同标量的值进行值计算 对象,行为未定义。

答案 2 :(得分:0)

没有编译错误。它不会进入第一个if语句,因为它是未定义的行为(如用户babon所提到的)。

行为实际上取决于您正在使用的编译器。

答案 3 :(得分:0)

未定义的行为,因为routes.rbmatch ':controller(/:action(/:id))', :via => [:get, :post] 增量取决于编译器。请参阅堆栈溢出问题https://swift.org/migration-guide/

C99标准 - 6.5表达式,§2

  

在前一个和下一个序列点之间,一个对象应该具有它   通过表达式的评估,最多修改一次存储值。   此外,先前的值应只读以确定该值   存储。

答案 4 :(得分:-3)

我没有得到你的问题。你在问“为什么只有先执行才能执行语句”?如果是,则以下是原因

i--评估表达式然后递减 --i首先递减然后评估表达式。因此,第二个条件评估为'假'(10 == 9)