C语言求助!谢谢解答!
我不太懂那个结果q=22?而不是等于q=6+7+8=21 7+7+8 = 22编译器优化问题
一看就知道是我大天朝的题目。 哥斯拉不说话 发表于 2015-7-10 16:23
7+7+8 = 22
编译器优化问题
一看就知道是我大天朝的题目。
大天朝?什么意思? 小阿妞 发表于 2015-7-11 10:43
大天朝?什么意思?
这道题是专门拿出来坑人的。。。。实际中千万别这么写,会死的很惨。。。
q = ++j;
q += (++j);
q += (++j); musilintan 发表于 2015-7-11 15:39
这道题是专门拿出来坑人的。。。。实际中千万别这么写,会死的很惨。。。
q = ++j;
q += (++j);
当j=5时候,q=6
q+=7不也应该是q=6+7=13 ?
q+=8不事q=13+8=21 ? 哥斯拉不说话 发表于 2015-7-10 16:23
7+7+8 = 22
编译器优化问题
一看就知道是我大天朝的题目。
能具体点么? 小阿妞 发表于 2015-7-12 08:09
当j=5时候,q=6
q+=7不也应该是q=6+7=13 ?
q+=8不事q=13+8=21 ?
对啊 小阿妞 发表于 2015-7-12 08:10
能具体点么?
编译器会给你一个优化, 这是编译器的问题,不同的编译器可能会有不同的结果,比如你用 vc 就会显示出22,换一个别的,就可能是 21, 具体的就要反汇编了,通过汇编代码就会发现 5+1=6, 6+1=7, 7+7=14, 7+1=8, 14+8=22,就是这样算出来的。 小阿妞 发表于 2015-7-12 08:09
当j=5时候,q=6
q+=7不也应该是q=6+7=13 ?
q+=8不事q=13+8=21 ?
1.按照常理应该是这样的:
q = (++j) + (++j) + (++j);
因为++的符号优先级别高,会先将所有的++执行完毕后再执行+运算。
q = 8 + 8 + 8;
q = 24;
这是正常解法。
2.编译器不支持8+8+8这样的运算,他有自己个性的算法。
q = (++j) + (++j) + (++j);
他会将上面的表达式理解为:
q = ((++j) + (++j)) + (++j);
q = (7 + 7) + (++j);
q = (7 + 7) + 8;
q = 22;
在平时使用的过程中,尽量不要让++多次用到一个表达式里面,每个编译器都有自己的个性算法,指不定就给你算出个奇葩的数据,到时候出了异常,你连哭的地方都没有。。。节哀。。。 不同的编译器可能给出不同的结果,一行语句最好只有一个++或-- 唉……汇编好重要啊!
看来要C和汇编一起学了
:dizzy: mse9591 发表于 2015-7-13 01:09
唉……汇编好重要啊!
看来要C和汇编一起学了
还跑去学汇编,不吐学三升算你好的了,你还不如跟c++一起学呢 nin98 发表于 2015-7-13 12:30
还跑去学汇编,不吐学三升算你好的了,你还不如跟c++一起学呢
:funk:有那么恐怖么…… 7 + 7 + 8
自己反汇编看看吧 牡丹花下死做鬼 发表于 2015-7-13 14:09
7 + 7 + 8
自己反汇编看看吧
这个会被编译优化。
估计这妹子是才学编程的。 无名侠 发表于 2015-7-13 20:05
这个会被编译优化。
估计这妹子是才学编程的。
对的 我这边是 7 + 7 + 8
就为了这个我还特意发过帖子 结果...... 发帖之前啊就不能搜索下论坛么 牡丹花下死做鬼 发表于 2015-7-13 20:41
对的 我这边是 7 + 7 + 8
就为了这个我还特意发过帖子 结果...... 发帖之前啊就不能搜索下论坛么
这妹纸学习好勤奋。新一代大神正在萌芽中。。。
页:
[1]