为什么此代码在第一个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");
}
}
答案 0 :(得分:3)
i==i--
是未定义的行为。请检查:http://c-faq.com/expr/ieqiplusplus.html和此:http://c-faq.com/expr/seqpoints.html
答案 1 :(得分:2)
表达式i==i--
将导致未定义的行为,因为i
和i--
的两个评估之间没有序列点。这意味着任何事情都可能发生,此时程序不再产生有意义的输出。
表达式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.rb
和match ':controller(/:action(/:id))', :via => [:get, :post]
增量取决于编译器。请参阅堆栈溢出问题https://swift.org/migration-guide/
C99标准 - 6.5表达式,§2
在前一个和下一个序列点之间,一个对象应该具有它 通过表达式的评估,最多修改一次存储值。 此外,先前的值应只读以确定该值 存储。
答案 4 :(得分:-3)
我没有得到你的问题。你在问“为什么只有先执行才能执行语句”?如果是,则以下是原因
i--评估表达式然后递减 --i首先递减然后评估表达式。因此,第二个条件评估为'假'(10 == 9)