表达式的准确定义是什么?声明中的变量名是否为表达式?
C++声明中的变量名是否属于表达式?
核心结论
声明语句int x;中的x不属于表达式,尽管语法规则里将其称为id-expression——这是因为语法非终结符的名称会在不同语境下复用,语义完全不同。
表达式的语法层级
C++的表达式语法是分层的:
- 顶层语法单元是
expression,它由更低层级的语法单元推导而来,比如additive-expression、multiplicative-expression、primary-expression等,这些带后缀的??-expression都是表达式家族的成员。 - 比如
1 + 2里的1和2,属于primary-expression,是expression推导链的一部分,所以它们确实是表达式,符合常识认知。
声明语境与表达式语境的区别
语法里的id-expression存在两种完全不同的语境:
- 表达式语境:比如
x = 10;或cout << x;中的x,此时id-expression是primary-expression的一部分,属于表达式,用来表示一个值或对象,参与计算或操作。 - 声明语境:
int x;中的x是declarator-id,它的作用是声明变量的标识符,不参与任何计算,也不产生值,因此不属于表达式。
简单来说:语法名称的复用不代表语义一致,判断一个语法单元是否是表达式,关键看它是否处于表达式语境——即是否用于产生值、执行计算或作为操作数。
内容的提问来源于stack exchange,提问作者HolyBlackCat
相关产品推荐
相关产品推荐

