是谁定义了运算符的优先级和结合性,它与求值顺序有什么关系?

25 浏览
0 Comments

是谁定义了运算符的优先级和结合性,它与求值顺序有什么关系?

介绍

在每本关于C/C++的教科书中,你都会找到一个操作符优先级和结合性的表格,如下所示:

操作符优先级和结合性表格

https://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标准。令我再次惊讶的是,关于操作符优先级和结合性几乎没有提到很多内容。

问题

  1. 如果我错误地认为函数总是从左到右评估,那么有关函数优先级和结合性的表格到底意味着什么?

  2. 如果不是ANSI定义操作符优先级和结合性,那么是谁定义的?如果是ANSI制定了定义,为什么对操作符优先级和结合性几乎没有提及?操作符优先级和结合性是从ANSI C标准推导出来的还是在数学中定义的?

0