求解答
在自增符运算中#include <stdio.h>
void main()
{
int a = 5, q;
q = (++a) + (++a) + (++a);
printf ("%d, %d\n", q, a);
}
为什么最后运算结果为22,运算不是应该是6+7+8=21吗?求大佬解答{:5_100:} 自己搜索一下论坛,搜索百度也行
因为已经有好多人提出过这类问题
说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜帖吧,然后搜百度,真的疯了,各种答案完全是漏洞百出,而且也没见人设置一个最佳答案,唯一能让人信服的就是说,这个问题是反汇编的时候能懂,然后我又不会汇编语言,所以就很蛋疼。
然后网上找不到,我就又去翻书,找到了一个勉强能让人接受的,楼主你看一下,以后等我学了汇编再来救你。
以下内容出自《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标准并未定义结果应该是什么。
遵循以下规则,很容易避免类似的问题:
如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符;
如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。
----------------------------------分割线-------------------------------------------------
所以楼主你就记住最后两条吧,咱们也不知道啥原因,只能等以后学了汇编再来救你了。 风吹来了 发表于 2020-3-26 17:22
说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜 ...
到时候等着大佬解救萌新了 风吹来了 发表于 2020-3-26 17:22
说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜 ...
换句话说是不同的编译器所处理的结果是不同的吗 音;; 发表于 2020-3-28 14:22
换句话说是不同的编译器所处理的结果是不同的吗
这个倒不确定,但是之所以导致这种结果的原因好像是因为汇编的过程,跟编译器关系貌似不大,不过反正你记住那个书上最后两条就行了,这样就不会有这种问题了,我现在自己也暂时只能这样了,抱歉 风吹来了 发表于 2020-3-28 14:26
这个倒不确定,但是之所以导致这种结果的原因好像是因为汇编的过程,跟编译器关系貌似不大,不过反正你记 ...
好的,谢谢
页:
[1]