为什么这个计算结果是64?
c语言吧
全部回复
仅看楼主
level 1
后后现代人
楼主
如题,为什么结果是64?这个结果怎么算出来的?
2022年07月10日 11点07分
1
吧务
level 14
GTA小鸡
你们为什么要固执地研究这种问题?
2022年07月10日 11点07分
2
bae😲
@后后现代人
这个是屁的细节 毫无意义 毫无章法
2022年07月10日 15点07分
Depressant
@后后现代人
研究这种细节只会决定失败,不会决定成功。
2022年07月11日 00点07分
星河口蘑
@后后现代人
这不是细节,这是未定义行为,C语言标准里没有规定,所以编译器想怎么做都是对的。
2022年07月10日 23点07分
贴吧用户_Q34XUXV
@后后现代人
闲得研究这个
2022年07月11日 03点07分
吧务
level 15
▫XeO2▫
这是今天的第二个UB了,希望不要有第三个
2022年07月10日 11点07分
3
Z_U98
这个带括号,执行顺序应该只有一种
2022年07月11日 03点07分
Z_U98
不过不是2*3*4的原因可能有一点点探究意义
2022年07月11日 03点07分
▫XeO2▫
@Z_U98
有没有括号都一样,就算把其中一个乘法表达式括起来还是一样,都是UB
2022年07月11日 03点07分
Z_U98
@▫XeO2▫
请问这是因为这一行只有一个sequence,但是有多个++符号么
2022年07月11日 04点07分
level 9
bjyssgk
未定义行为,不同的编译器有不同的结果。
2022年07月10日 11点07分
4
level 13
伊卡璐🌟
爱怎么出来就怎么出来
2022年07月10日 11点07分
7
吧务
level 12
YujiSY
别研究这种代码的,依赖于编译器
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
bae😲
@后后现代人
这和麻烦有什么关系 这是编译器的处理方法不同 你怎么统一不同处理方法的结果呢?
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分
Gianto🌀
@后后现代人
vs用的不是gcc吗
2022年07月11日 00点07分
hiehiehieh
@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
pugai
别纠结这种代码,不同编译器出来的结果不一样,如果确实想弄明,反汇编看一下如何实现的就明白了
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
尾页