C++ 主表达式 - 它是不是主表达式?

标签 c++ standards expression

  1. 为什么它们被称为“主要”?按照评估的顺序,他们是第一个?

  2. C++03标准定义第5章(注1)中的表达式:

    An expression is a sequence of operators and operands that specifies a computation.

    然后5.1“初级表达式”定义了初级表达式列表:

    (1) 主表达式:

    literal
    
    this
    
    ( expression )
    
    id-expression
    

    我的主要问题是关于第三点:

    ( expression )
    

    所以,按照标准,所有带括号的表达式都是初级表达式,首先计算它们。它看起来合乎逻辑,并且对 C++ 表达式中括号的行为(优先级)给出了准确的解释。

    所以这意味着例如

    (variable + 10)
    

    是一个初级表达式。

    var = (variable + 10) * 3
    

    根据我的理论,它看起来合乎逻辑,但从我知道的其他来源来看

    (variable + 10)
    

    不是主要表达式,但为什么呢?我不明白,但是标准将 (expression) 定义为主要表达式。

请帮助我,因为我做不到。非常感谢,抱歉我的英语不好。 嗨。

最佳答案

C++ 表达式可以很复杂,也就是说它们可以由嵌套表达式组成,通过使用运算符组合,而这些嵌套表达式又可能很复杂。

如果您将一个复杂的表达式分解成更小的单元,在某些时候您将留下原子单元,因为它们无法进一步分解。这些是主要的表达方式;它们包括标识符、文字、关键字 this , 和 lambda 表达式。

但是,确实有一种非原子构造被 C++ 标准定义为主要构造:用圆括号(也称为圆括号)括起来的表达式。所以 (variable + 10)您给出的示例是一个主要表达式(子表达式也是variable(这是一个标识符),和10(这是一个文字)。

我相信标准将它们列为主要表达式,因为它们在评估顺序方面扮演着真正原子表达式的角色:括号内的任何内容都必须先评估,然后后退表达式的值才能进入评估其他表达:在(5+10)*a , 5+10 的值必须先评估才能进入*a的评估. [请注意,这并不意味着 5+10在表达式 a 之前求值被评估。这只意味着 5+10必须先评估乘法本身。]

因此,从这个意义上说,括号中的子表达式就好像它们是原子的一样。

我想这就是标准不使用术语“原子表达式”来表示这个概念的原因。它们的行为就好像它们是原子的,但至少括号中的变体实际上不是原子的。在我看来,“主要”是个不错的用词。

关于C++ 主表达式 - 它是不是主表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17259531/

相关文章:

c# - MVC html 助手如何使用表达式获取对象属性

c++ - vec [i] [j]转换为*(vec + i + j)吗?

c++ - 无法在 Windows 中使用 gcc 链接器链接头文件

c++ - 为什么 numeric_limits<uint16_t>::max() 不等于 -1?

javascript - ie8_getElementById()

c++ - 重新定义 C++ 关键字是否合法?

c# - 按表达式树的可枚举选择

c++ - 了解内存池

c++ - 无法通过 Linux 上的 FreeTDS bcp API 将 DATE 插入 mssql

linq - LINQ 的 Expression.Quote 方法的目的是什么?