C++03标准定义了第5章(注1)中的表述:
表达式是指定计算的运算符和操作数序列。然后5.1“主表达式”定义了主表达式的列表:
(1)初级-表达:
文字这个(表达式)id-表达式
我的主要质询是关于第三点:
(表达)
因此,根据标准,每个带括号的表达式都是主表达式,并首先进行计算。它看起来是合乎逻辑的,并给出了C++表达式中括号行为的确切解释(优先级)。
所以这意味着,例如
(变量+ 10)
是一个主要表达式。
var =(变量+ 10) *3
根据我的理论,这看起来很符合逻辑,但从我所知道的其他来源来看
(变量+ 10)
不是一个主要的表达,但为什么?我不明白,但是标准将(expression)定义为主表达式。
请帮帮我,因为我做不到。非常感谢,也很抱歉我的英语很差。嗨。
发布于 2013-06-23 10:13:21
C++表达式可以是复杂的,也就是说,它们可以由嵌套表达式组成,通过使用运算符组合而成,而这些嵌套表达式又可能是复杂的。
如果你把一个复杂的表达式分解成更小的单位,那么在某个时候,你就会得到原子化的单位,因为它们不能被进一步分解。这些是主表达式;它们包括标识符、文字、关键字this和lambda表达式。
但是,确实存在一个非原子结构,C++标准将其定义为主结构:括在圆括号中的表达式(也称为括号)。因此,您给出的(variable + 10)示例是一个主表达式(子表达式variable (它是一个标识符)和10 (一个文本))。
我认为标准将它们列为主要表达式,因为在计算顺序方面,它们扮演着真正的原子表达式的角色:方括号内的任何内容都必须在括号内的表达式的值与其他表达式一起进行计算之前进行计算:在(5+10)*a中,必须对5+10的值进行计算,然后才能进入*a的计算。请注意,这并不意味着在计算表达式5+10之前计算a。这只意味着在计算乘法本身之前,必须对5+10进行计算。
因此,括号内的子表达式,从这个意义上说,就好像它们是原子的。
我想这就是为什么标准不使用“原子表达式”这个概念的原因。它们的行为就好像它们是原子的,但至少括号内的种类实际上并不是原子的。在我看来,“小学”似乎是一个很好的词汇选择。
发布于 2020-07-30 21:31:55
主表达式这个词是语言语法中的一个元素.它们同样可以被称为foobar表达式,它只是一个没有任何更深层次含义的名字。
主表达式不一定是原子的,首先计算,顶级的,比其他表达式更重要,或者类似的东西。所有表达式都是“构建块”,因为可以添加任何表达式以形成更大的表达式。
问题中已经给出了定义,所以我不会在这里重复。
(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函数,并将结果括号化;代码借用自:这里)。
此外,这个问题与人们对评价的优先级和顺序的普遍误解相调情。标准根本没有提到“优先”。优先级表是以一种易于阅读的方式表示语言语法规则的一种方式。
它指的是操作数与运算符分组的方式,而不是执行子表达式的顺序。就f() + ([]{int n, t1 = 0, t2 = 1, nextTerm = 0; cout << "Enter the number of terms: ";而言..。等等,在lambda被调用之前,f()可能被调用,也可能不被调用。lambda周围的括号不会导致首先对其进行计算。
https://stackoverflow.com/questions/17259531
复制相似问题