以下是我在 ubuntu 13.10 中运行的代码。代码:-
#include<stdio.h>
main()
{
int i=10,j=10;
i=i++ + ++j;
printf("i=%d j=%d\n",i,j);
j=++i + j++;
printf("i=%d j=%d\n",i,j);
}
输出:-
i=21 j=11
i=22 j=33
从逻辑上讲,根据规则,答案应该是:-
i=22 j=11
i=23 j=35
当我在 ubuntu 12.10 中运行此代码时,我得到了正确的答案,即上面的答案。请解释一下发生了什么?
答案1
这是未定义或依赖于实现的行为的典型结果。当您的表达式在等式的两个位置上都改变变量时(以及许多其他情况),您基本上做错了。仅仅因为它在一个编译器版本上“有效”并不意味着它会在下一个版本中给出相同的答案。仔细阅读语言规范,看看哪些事情是未定义的或依赖于实现的,并避免它们。这两个答案都不是“正确的”,它们是未定义的。不同的答案甚至可能由同一编译器的不同优化触发。
实际上,您应该使用编译器警告标记和静态分析工具(如 valgrind 或 Purify)来标记这些事情。除非您理解“左值”和“右值”等术语的含义,否则仅使用运算符优先级表不足以真正理解某些前置/后置固定增量/减量运算符的情况。