|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在自增符运算中
#include <stdio.h>
void main()
{
int a = 5, q;
q = (++a) + (++a) + (++a);
printf ("%d, %d\n", q, a);
}
为什么最后运算结果为22,运算不是应该是6+7+8=21吗?求大佬解答
说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜帖吧,然后搜百度,真的疯了,各种答案完全是漏洞百出,而且也没见人设置一个最佳答案,唯一能让人信服的就是说,这个问题是反汇编的时候能懂,然后我又不会汇编语言,所以就很蛋疼。
然后网上找不到,我就又去翻书,找到了一个勉强能让人接受的,楼主你看一下,以后等我学了汇编再来救你。
以下内容出自《C Primer Plus》:
n = 3;
y = n++ + n++;
可以肯定的是,执行完这两条语句后,n的值会比旧值大2。但是,y的值不确定。在 对y求值时,编译器可以使用n的旧值(3)两次,然后把n递增1两次,这使得y的值 为6,n的值为5。或者,编译器使用n的旧值(3)一次,立即递增n,再对表达式中的第2 个n使用递增后的新值,然后再递增n,这使得y的值为7,n的值为5。两种方案都可行。 对于这种情况更精确地说,结果是未定义的,这意味着C标准并未定义结果应该是什么。
遵循以下规则,很容易避免类似的问题:
如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符;
如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。
----------------------------------分割线-------------------------------------------------
所以楼主你就记住最后两条吧,咱们也不知道啥原因,只能等以后学了汇编再来救你了。
|
|