为什么这个计算结果是64?
c语言吧
全部回复
仅看楼主
level 1
如题,为什么结果是64?这个结果怎么算出来的?
2022年07月10日 11点07分 1
吧务
level 14
你们为什么要固执地研究这种问题?
2022年07月10日 11点07分 2
@后后现代人 这个是屁的细节 毫无意义 毫无章法
2022年07月10日 15点07分
@后后现代人 研究这种细节只会决定失败,不会决定成功。
2022年07月11日 00点07分
@后后现代人 这不是细节,这是未定义行为,C语言标准里没有规定,所以编译器想怎么做都是对的。
2022年07月10日 23点07分
@后后现代人 闲得研究这个
2022年07月11日 03点07分
吧务
level 15
这是今天的第二个UB了,希望不要有第三个
2022年07月10日 11点07分 3
这个带括号,执行顺序应该只有一种
2022年07月11日 03点07分
不过不是2*3*4的原因可能有一点点探究意义
2022年07月11日 03点07分
@Z_U98 有没有括号都一样,就算把其中一个乘法表达式括起来还是一样,都是UB
2022年07月11日 03点07分
@▫XeO2▫ 请问这是因为这一行只有一个sequence,但是有多个++符号么
2022年07月11日 04点07分
level 9
未定义行为,不同的编译器有不同的结果。
2022年07月10日 11点07分 4
level 13
爱怎么出来就怎么出来
2022年07月10日 11点07分 7
吧务
level 12
别研究这种代码的,依赖于编译器
2022年07月10日 11点07分 8
level 5
[呵呵]
2022年07月10日 11点07分 9
level 14
如果0除以0算出来等于0,希望你不要问为什么,这个表达式本身就是未定义的
2022年07月10日 12点07分 12
你说的不对
2022年07月10日 15点07分
level 11
这种多意性的表达式,其结果取决于 编译器 的 优化处理方法。
b = ((++a) * (++a) * (++a) );
若 处理 成:
t = (++a) ; t = a+1 = 1+1 = 2;
b = t*t*t; b = 2*2*2 = 8; 结果 得 8
若处理成:
a= 1;
t = (++a) =2; t = (++a) =3;
b1 = (t * t ) = 3*3 = 9;
t = (++a) = 4;
b = b1 * t = 9*4 = 36.
还可以处理成....
一旦脑洞大开,只有你想不到的,没有做不到的结果出来。
2022年07月10日 12点07分 13
@后后现代人 这和麻烦有什么关系 这是编译器的处理方法不同 你怎么统一不同处理方法的结果呢?
2022年07月10日 16点07分
你这方法太麻烦,这题现在口算就能出来
2022年07月10日 15点07分
@后后现代人 问题出在 语句的多义性多意性。口算也是多结果。
2022年07月11日 12点07分
@bae😲 是的,编译时要告诉编译器如何优化或不优化。可选:/O1 minimize space /O2 maximize speed /Oa assume no aliasing /Ob<n> inline expansion (default n=0) /Od disable optimizations (default) 等等。
2022年07月11日 12点07分
level 1
今天花了1个小时已经摸清楚这里面的计算规律了,分别用了VS和Turbo C分别进行了验证,结果均准确
2022年07月10日 13点07分 14
你用的windows gcc 编译不都一样
2022年07月10日 15点07分
@混还是躺 我没试GCC编译器,但是那两个都没问题
2022年07月10日 15点07分
@后后现代人 vs用的不是gcc吗[捂嘴笑][捂嘴笑][捂嘴笑]
2022年07月11日 00点07分
@Gianto🌀 vs是msvc跟gcc区别大了去了
2022年07月11日 03点07分
level 1
这个计算这样最准:
如果是(++a)的三次方,就如同1楼的那个,3个++a就自加3次后再来个3次方即可,也就是先自加3次,a的赋予的初值是1,自加3次为4,然后算4的3次方,就出了64
同理,如果a的初值为1,算((++a)*(++a)*(--a)*(++a)*(++a)*(--a)*(--a))也很简单,1+(1+1-1+1+1-1-1),得2,2的的7次方等于128
2022年07月10日 14点07分 15
VS和Turbo C我都试了,没问题。但是手机上的C编辑器我试了,不对,是3*4*5=60
2022年07月11日 13点07分
level 13
这边建议研究机器语言哦,细节决定成败[呵呵]
2022年07月10日 14点07分 16
直接看汇编,帮助更大[哈哈]
2022年07月10日 14点07分
@杯酒醉天下🍗 汇编是C的灵魂
2022年07月10日 15点07分
level 1
别纠结这种代码,不同编译器出来的结果不一样,如果确实想弄明,反汇编看一下如何实现的就明白了
2022年07月10日 14点07分 18
level 11
自己加油吧
2022年07月10日 14点07分 19
level 1
会不会是a自加完3次后得4,4*4*=64?
2022年07月10日 15点07分 20
1 2 3 4 5 尾页