鱼C论坛

 找回密码
 立即注册
查看: 1053|回复: 6

[已解决]求解答

[复制链接]
发表于 2020-3-26 12:09:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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吗?求大佬解答
最佳答案
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标准并未定义结果应该是什么。

遵循以下规则,很容易避免类似的问题:

如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符;
如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。

----------------------------------分割线-------------------------------------------------

所以楼主你就记住最后两条吧,咱们也不知道啥原因,只能等以后学了汇编再来救你了。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 16:22:26 | 显示全部楼层
自己搜索一下论坛,搜索百度也行
因为已经有好多人提出过这类问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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标准并未定义结果应该是什么。

遵循以下规则,很容易避免类似的问题:

如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符;
如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。

----------------------------------分割线-------------------------------------------------

所以楼主你就记住最后两条吧,咱们也不知道啥原因,只能等以后学了汇编再来救你了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

到时候等着大佬解救萌新了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

换句话说是不同的编译器所处理的结果是不同的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 14:26:04 | 显示全部楼层
音;; 发表于 2020-3-28 14:22
换句话说是不同的编译器所处理的结果是不同的吗

这个倒不确定,但是之所以导致这种结果的原因好像是因为汇编的过程,跟编译器关系貌似不大,不过反正你记住那个书上最后两条就行了,这样就不会有这种问题了,我现在自己也暂时只能这样了,抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 13:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表