介绍
在每本关于 C/C++ 的教科书中,您都会找到一个运算符优先级和关联性表,如下所示:
http://en.cppreference.com/w/cpp/language/operator_precedence
StackOverflow 上的一个问题是这样的:
以下函数执行的顺序是什么:
f1() * f2() + f3();
f1() + f2() * f3();
参考前面的图表,我自信地回答说函数具有从左到右的关联性,因此在前面的语句中,在两种情况下都像这样评估:
f1() -> f2() -> f3()
评估功能后,您可以像这样完成评估:
(a1 * a2) + a3
a1 + (a2 * a3)
令我惊讶的是,很多人告诉我我完全错了。决心证明他们错了,我决定转向 ANSI C11 标准。我再次惊讶地发现,很少有人提到运算符优先级和关联性。
问题
- 如果我认为函数总是从左到右进行评估的信念是错误的,那么表中提到函数优先级和关联性的真正含义是什么?
- 如果不是 ANSI,谁来定义运算符优先级和关联性?如果是ANSI做出定义,为什么很少提及运算符优先级和关联性?运算符优先级和关联性是从 ANSI C 标准推断出来的,还是在数学中定义的?