对于表达式ab + cd + e*f ,我们佬师说第三个 * 和第一个 + 的执行顺序未知,即有以下两种情况:
情况1:
a*b
c*d
a*b + c*d
e*f
a*b + c*d + e*f
情况2:
a*b
c*d
e*f
a*b + c*d
a*b + c*d + e*f
请问是否存在问题,如果有问题,请指出问题;如果没问题,请解释顺序未知的原因。
谢谢!!
对于表达式ab + cd + e*f ,我们佬师说第三个 * 和第一个 + 的执行顺序未知,即有以下两种情况:
情况1:
a*b
c*d
a*b + c*d
e*f
a*b + c*d + e*f
情况2:
a*b
c*d
e*f
a*b + c*d
a*b + c*d + e*f
请问是否存在问题,如果有问题,请指出问题;如果没问题,请解释顺序未知的原因。
谢谢!!
编译器并不关心所谓求值顺序,关心的是结果的等价性
简单来说
a+b+c,既可以是先算a+b,结果+c,也可以是先算b+c,结果再加a
那么编译器编译出来的代码,究竟先算谁其实不重要。
再比如,就算编译器编译a+b+c+d得到
add a,b
add c,d
add a,c
这样的汇编代码,但是对于现代的超标量处理器
add a,b和add c,d很可能是同时发射的。
所以说,讨论代码求值顺序唯一的意义在于,这只是一个基准参照,也就是说编译器无论怎么弄,结果和这个参照的顺序相同
但是不意味着这个参照就是代码真实被执行的顺序