音;; 发表于 2020-3-26 12:09:09

求解答

在自增符运算中
#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:}

人造人 发表于 2020-3-26 16:22:26

自己搜索一下论坛,搜索百度也行
因为已经有好多人提出过这类问题

风吹来了 发表于 2020-3-26 17:22:12

说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜帖吧,然后搜百度,真的疯了,各种答案完全是漏洞百出,而且也没见人设置一个最佳答案,唯一能让人信服的就是说,这个问题是反汇编的时候能懂,然后我又不会汇编语言,所以就很蛋疼。

然后网上找不到,我就又去翻书,找到了一个勉强能让人接受的,楼主你看一下,以后等我学了汇编再来救你。

以下内容出自《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-28 14:18:20

风吹来了 发表于 2020-3-26 17:22
说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜 ...

到时候等着大佬解救萌新了

音;; 发表于 2020-3-28 14:22:36

风吹来了 发表于 2020-3-26 17:22
说实话,刚看到楼主的问题时觉得可能不会太难,然后就自己编译了一下,接着就开始思考,然后没有结论,就搜 ...

换句话说是不同的编译器所处理的结果是不同的吗

风吹来了 发表于 2020-3-28 14:26:04

音;; 发表于 2020-3-28 14:22
换句话说是不同的编译器所处理的结果是不同的吗

这个倒不确定,但是之所以导致这种结果的原因好像是因为汇编的过程,跟编译器关系貌似不大,不过反正你记住那个书上最后两条就行了,这样就不会有这种问题了,我现在自己也暂时只能这样了,抱歉

音;; 发表于 2020-3-29 09:22:02

风吹来了 发表于 2020-3-28 14:26
这个倒不确定,但是之所以导致这种结果的原因好像是因为汇编的过程,跟编译器关系貌似不大,不过反正你记 ...

好的,谢谢
页: [1]
查看完整版本: 求解答