对于表达式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很可能是同时发射的。
所以说,讨论代码求值顺序唯一的意义在于,这只是一个基准参照,也就是说编译器无论怎么弄,结果和这个参照的顺序相同
但是不意味着这个参照就是代码真实被执行的顺序
【以下回答由 GPT 生成】
问题分析
在C语言中,表达式求值的顺序是有规定的。根据C语言标准(C11标准),表达式的运算符优先级决定了表达式求值的顺序。按照C语言的规定,乘法运算符(*)的优先级高于加法运算符(+),因此乘法运算会先于加法运算进行。
根据情况1和情况2的描述,可以得出以下结论:
情况1中,表达式的求值顺序是(a*b) + (c*d) + (e*f)
,先计算乘法运算,再计算加法运算。
情况2中,表达式的求值顺序是(a*b) + (c*d) + (e*f)
,先计算乘法运算,再计算加法运算。
根据以上分析,根据C语言的规定,这两种情况的求值顺序都是按照乘法运算优先级高于加法运算的顺序进行的,因此不存在问题。
回答问题
根据问题分析,回答如下:
问题1: 是否存在问题?
答: 不存在问题。
问题2: 顺序未知的原因是什么?
答: C语言中,根据表达式中的运算符优先级,乘法运算优先级高于加法运算,根据这个规定,表达式的求值顺序是固定的,乘法运算将先于加法运算进行。因此,不存在顺序未知的情况。
解决方案以markdown格式返回。