gcc如何评估分数对分数的影响?

gcc如何评估分数对分数的影响?,c,C,在gcc中如何评估形式为a/b/c/d的表达式?它是(a*d)/(b*c)还是((a/b)/c)/d)?C标准中对此有规定吗?操作顺序: A/B/C/D就像它所说的((A/B)/C)/D < P> C标准(和C++标准),在确定优先级时,从左到右进行操作符的评估。如果编译器知道可以在不影响实际结果的情况下优化操作,那么它可以优化操作,但是如果结果[在标准定义的行为范围内]受到影响,从而改变结果,那么它将无效。特别是,如果在编译时已知所有值,则可以将小常量优化为更大的常量 换言之,((a/b)

在gcc中如何评估形式为
a/b/c/d
的表达式?它是
(a*d)/(b*c)
还是
((a/b)/c)/d)
?C标准中对此有规定吗?

操作顺序:

A/B/C/D就像它所说的((A/B)/C)/D

< P> C标准(和C++标准),在确定优先级时,从左到右进行操作符的评估。如果编译器知道可以在不影响实际结果的情况下优化操作,那么它可以优化操作,但是如果结果[在标准定义的行为范围内]受到影响,从而改变结果,那么它将无效。特别是,如果在编译时已知所有值,则可以将小常量优化为更大的常量

换言之,((a/b)/c)/d应进行计算

--
Mats

乘法运算符都是左关联的,如语法()所示:

6.5.5乘法运算符
语法

1还有一些规则,它们很重要……我在两个不同的编译器上试过,观察到异常,因此问题就出现了,这里绝对不是玩琐事。我期待着投票的结果。看优先表。@Bleamer什么异常?由于标准将其定义为
((a/b)/c)/d
,我很好奇是哪种编译器以哪种方式破坏了它。我有一个16位编译器,无法派生名称,但在dos 3.0上尝试了这一点。特别是,如果有溢出,替换可能会影响结果。因此,使用a/cb而不是ab/c可能会防止溢出,但会导致不准确。@glglgl如果编译器决定更改顺序和/或计算值的方式,则可能会以各种不同的方式“更改”结果。但同时,如果编译器能够确定执行这样的优化是安全的,那么它也可以这样做,这就是我的观点。我的观点是,如果听起来合理,用户可以改变想法。 multiplicative-expression: cast-expression multiplicative-expression * cast-expression multiplicative-expression / cast-expression multiplicative-expression % cast-expression
((a / b) / c) / d