-5

我知道这个话题已经出现了无数次,但我请求一点时间。

我曾多次尝试理解这一点,也是在评估顺序的背景下。我一直在寻找一些明确的例子来理解 op。优先级,我在这里找到了一个:http: //docs.roxen.com/pike/7.0/tutorial/expressions/operator_tables.xml我想知道的是那里给出的例子(我已经剪切粘贴在下面)是正确的。

1+2*2                  =>  1+(2*2)
1+2*2*4                =>  1+((2*2)*4)
(1+2)*2*4              =>  ((1+2)*2)*4
1+4,c=2|3+5            =>  (1+4),(c=(2|(3+5)))
1 + 5&4 == 3           =>  (1 + 5) & (4 == 3)
c=1,99                 =>  (c=1),99
!a++ + ~f()            =>  (!(a++)) + (~(f()))
s == "klas" || i < 9   =>  (s == "klas") || (i < 9)
r = s == "sten"        =>  r = (s == "sten")

例如,根据 C 规范,确实1+2*2*41+((2*2)*4)或者可能已经是。1+(2*(2*4))任何帮助或对示例的进一步参考都会很有用。再次感谢。

4

4 回答 4

1

大多数运算符的优先级从左到右。这将详细介绍运算符优先级:

点击这里

于 2013-09-22T17:26:50.420 回答
1

二元运算符,除了赋值运算符,当它们具有相同的优先级时,从左到右,所以1 + 2 * 2 * 4等价于1 + ((2 * 2) * 4). 显然在这种特殊情况下1 + (2 * (2 * 4))给出了相同的答案,但并非总是如此。例如,1 + 2 / 2.0 * 4评估为1 + ((2 / 2.0) * 4) == 5.0不是1 + (2 / (2.0 * 4)) == 1.25

评估顺序与运算符优先级完全不同。一方面,运算符的优先级总是明确定义的,而评估顺序有时不是(例如,评估函数参数的顺序)。

于 2013-09-22T17:29:54.353 回答
1

尽管这些示例来自不同的语言,但我认为它们与 C 中的运算符优先级相同。通常,您最好使用 C 语言的参考,例如 C 标准,或摘要,例如维基百科中的一个。

但是,我不相信这实际上是您要问的。运算符优先级对评估顺序没有影响。所有运算符优先级的作用是向您展示如何为表达式加上括号。允许 AC 编译器以它希望的任何顺序评估操作。如果可以证明代数恒等式对于所有有效输入都具有相同的结果,则也允许使用代数恒等式(浮点计算通常不是这种情况,但对于无符号整数计算通常是这样)。

编译器需要生成具有特定评估顺序的代码的唯一情况是:

  1. 短路布尔运算符&&and ||: 必须首先计算左参数,在某些情况下可能不计算右参数;

  2. 所谓三元运算符:必须先计算?:左参数(在 之前);?随后,将评估另外两个运算符中的一个。请注意,此运算符向右分组,表明分组和评估顺序之间没有关系。也就是说,pred_1 ? action_1() : pred_2 ? action_2() : pred_3 ? action_3()与 相同pred_1 ? action_1() : (pred_2 ? action_2() : pred_3 ? action_3()),但它pred_1必须首先评估。

  3. 逗号运算符,:必须首先评估左参数。这与在函数调用中使用逗号不同。

  4. 函数参数必须在调用函数之前进行计算,尽管没有指定参数的计算顺序,也没有指定生成函数的表达式的计算顺序。

最后一句话指的是这样的例子:

// This code has Undefined Behaviour. DO NOT USE
typedef void(*takes_int_returns_void)(int);
takes_int_returns_void fvector[3] = {...}
//...
//...
(*fvector[i++])(i);

在这里,编译器可能会选择i在评估函数的参数之前或之后递增(或其他不太愉快的可能性),因此您实际上并不知道函数将被调用的值是什么。

在这种情况下1+2*2*4,编译器必须生成将生成的代码17。它如何做到这一点完全取决于编译器。此外,如果 all和x都是无符号整数,编译器可以使用它想要的任何乘法顺序进行编译,甚至重新排序为。yz1 + x*y*zy*(x*z)

于 2013-09-22T18:12:54.687 回答
0

这是一个关于运算符优先级和评估顺序的完美教程。享受!

于 2013-09-22T18:17:13.280 回答