我觉得我在这里区分子表达与表达有点混淆。
Compound expression
- 涉及多个运算符的表达式。
E.g。 1 + 1 * 1
Expression
- 具有一个或多个操作数的运算符。
E.g 1 + 1
或+ 1
是否有一个低于表达式的级别,称为子表达式?
答案 0 :(得分:9)
表达式可能没有运算符。例如,在以下内容中:
int a = 0;
a;
a
是一个表达式。引用C ++标准,表达式是“指定计算的一系列运算符和操作数”(C ++ 03 5/1)。在这里,即使没有运算符,a
也是“操作数”。
子表达式是任何表达式,它是较大表达式的一部分。所以,在
int a = 0, b = 0, c = 0, d = 0;
a * b + c * d;
a * b
和c * d
是子表达式。
单词“compound”通常用于语句,而不是表达式。复合语句是一对可以包含一系列其他语句的大括号。例如,函数体几乎总是复合语句,许多循环体也是如此。
通常,复杂表达式只是简称为“表达式”,它们的部分称为子表达式。
答案 1 :(得分:6)
C ++标准定义了什么 表达式在整章中(如果我没记错的话,第5章)。
C ++标准没有定义复合表达式是什么
C ++标准将full expression
定义为一个表达式,它不是任何其他表达式的子表达式
示例:
a + 4 + 5;
a + 4 + 5
是一个完整的表达方式。该表达式中的a
,4
和a + 4
都不是完整表达式(尽管它们是(子)表达式),因为它是上述表达式的子表达式
答案 2 :(得分:4)
虽然你已经收到了一些好的答案,但我还会添加一个从这些答案中可能不明显的细节:一个子表达式也可以是一个完全独立的表达式,而不是整个表达式的词法部分。评价。
这个显而易见的例子是当你调用一个使用默认参数的函数时。在这种情况下,为参数分配默认值被视为调用表达式的子表达式。例如,给出类似的东西:
int f(int const &x=2) { return x; }
int y = f()+4;
f()
创建一个临时int
,其初始化为值2,然后通过引用传递给f
。即使文本y= f() + 4
完全独立,该临时文件的创建和初始化也是完整表达式int const &x=2
的子表达式。
答案 3 :(得分:0)
据我从上述定义中了解,2+3
,-4
和*ptr
是表达式。什么可以比这更短?也许只有标识符和常量,例如4
。