C运算符优先级

时间:2014-03-10 03:34:22

标签: c compiler-construction bison lex operator-precedence

对于我的编译器类,我们正在逐步创建一个伪PASCAL编译器。但是,它确实遵循与C相同的优先级。尽管如此,在我们创建前缀和后缀运算符的部分中,我得到0

int a = 1;
int b = 2;
++a - b++ - --b + a--

当C返回1.我不明白你怎么能得到1.首先做直线前缀,答案应该是2.首先做后缀,答案应该是-2。通过从左到右做一切,我得到零。

我的问题是,我的操作员优先考虑的是返回1?

3 个答案:

答案 0 :(得分:1)

运算符优先级告诉您例如++a - b(++a) - b还是++(a - b)。显然它应该是前者,因为后者甚至不是有效的。在您的实现中,它显然是前者(或者您根本不会得到结果),因此您正确地实现了运算符优先级。

运算符优先级与子表达式的计算顺序无关。实际上,运算符操作+-的顺序在C中未指定,并且任何修改同一变量两次而没有序列点的代码会调用未定义的行为。因此,无论您选择哪个订单都是正常的,0与任何其他值一样有效。

答案 1 :(得分:1)

连续几次更改变量是非法的(大致在asignments之间,标准谈论序列点)。从技术上讲,这就是C标准所谓的未定义行为。编译器没有义务发现你正在写废话,并且可以假设你永远不会这样做。运行程序时(甚至编译时)都会发生任何事情。另请检查术语文件中的nasal demons

答案 2 :(得分:0)

  

++递增和{{1​​}}递减运算符可以放在值之前或之后,不同的影响。如果放在操作数(前缀)之前,则立即更改其值,如果放在操作数(后缀)之后,则首先记录其值,然后更改该值。

McGrath,迈克。 (2006年)。简单的C编程,第2版。英国:计算机步骤。