10
  1. 为什么称它们为“初级”?在评估的顺序中,他们是第一位的?

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

    表达式是指定计算的一系列运算符和操作数。

    那么5.1“主要表达式”定义了主要表达式列表:

    (1) 初级表达式:

    literal
    
    this
    
    ( expression )
    
    id-expression
    

    我的主要问题与第三点有关:

    ( expression )
    

    因此,根据标准,每个带括号的表达式都是初级表达式,它们是首先计算的。它看起来合乎逻辑,并准确解释了 C++ 表达式中括号的行为(优先级)。

    所以这意味着例如

    (variable + 10)
    

    是一个主要的表达。

    var = (variable + 10) * 3
    

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

    (variable + 10)
    

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

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

4

2 回答 2

9

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

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

然而,确实有一个 C++ 标准定义为主要的非原子构造:用圆括号(又名圆括号)括起来的表达式。所以(variable + 10)你给出的例子是一个主表达式(子表达式variable(它是一个标识符)和10(它是一个文字)也是如此。

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

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

我想这就是为什么标准不使用术语“原子表达式”来表示这个概念。它们的行为就好像它们是原子的,但至少括号中的变体实际上不是原子的。对我来说,“主要”似乎是一个不错的选择。

于 2013-06-23T10:13:21.043 回答
1

术语primary-expression是语言语法的一个元素。它们同样可以被称为foobar-expression,它只是一个没有任何更深层含义的名称。

primary-expression不一定是原子的、先求值的、顶级的、比其他表达式更重要或类似的东西。并且所有表达式都是“构建块”,因为可以添加任何表达式以形成更大的表达式。

问题中已经给出了定义,这里不再赘述。

(variable + 10)是一个主要的表达,你的“其他来源”是错误的。这是另一个主要表达式的例子:

([]{
int n, t1 = 0, t2 = 1, nextTerm = 0;

cout << "Enter the number of terms: ";
cin >> n;

cout << "Fibonacci Series: ";

for (int i = 1; i <= n; ++i)
{
    // Prints the first two terms.
    if(i == 1)
    {
        cout << " " << t1;
        continue;
    }
    if(i == 2)
    {
        cout << t2 << " ";
        continue;
    }
    nextTerm = t1 + t2;
    t1 = t2;
    t2 = nextTerm;
    
    cout << nextTerm << " ";
}
return 0;  
}())

(这会调用一个 lambda 函数并将结果括起来;代码是从 : here借来的)。


此外,这个问题还涉及到对优先级和评估顺序的普遍误解。该标准根本没有提到“优先级”。优先表是一种以更易于阅读的方式呈现语言语法规则的方式。

它指的是操作数与运算符的分组方式,而不是子表达式的执行顺序。在f() + ([]{int n, t1 = 0, t2 = 1, nextTerm = 0; cout << "Enter the number of terms: ";.... etc. etc. 的情况下,在f()调用 lambda 之前可能会或可能不会调用。lambda 周围的括号不会导致它首先被评估。

于 2020-07-30T21:31:55.837 回答