每个表达式是否都使用C++;具有类似于非引用类型的非指针类型 我正在阅读C++中的表达式,并在语句上阅读。

每个表达式是否都使用C++;具有类似于非引用类型的非指针类型 我正在阅读C++中的表达式,并在语句上阅读。,c++,c++11,reference,c++14,language-lawyer,C++,C++11,Reference,C++14,Language Lawyer,语句0.0 每个表达式都有一些非引用类型 引用的声明来自en.cppreference.com/w/cpp/language/value_category。选中页面顶部的第2行 现在我举了一些例子来理解这意味着什么。例如: int i = 100; // this expression has type int int &j = i; // this expression has type int or int&? b[4]; // Here assume that b is

语句0.0

每个表达式都有一些非引用类型

引用的声明来自en.cppreference.com/w/cpp/language/value_category。选中页面顶部的第2行

现在我举了一些例子来理解这意味着什么。例如:

int i = 100; // this expression has type int
int &j = i; // this expression has type int or int&?
b[4]; // Here assume that b is an array rvalue. So will this expression has  type int&& or int?

我的困惑是,我知道j是对int的引用,即j是int&但根据引用的语句,每个表达式都有一个非引用类型,这意味着
int&j=i具有int类型。是否正确?
我感到困惑的其他例子:

int a[4] = {2,4,4,9};
a[3]; // will this expression be int& type or int type?
现在在语句
a[3]a[3]是整型还是整型(&T)

下面是另一个例子:

int i = 100; // this expression has type int
int &j = i; // this expression has type int or int&?
b[4]; // Here assume that b is an array rvalue. So will this expression has  type int&& or int?

所以我的问题是指针也会发生类似的情况吗?也就是说,指针是否也有类似的语句(0.0)

int x = 34;
int *l = &x; // will this expression have type int* or int?
我现在知道这里l是指向int(复合类型)的指针。如果指针没有类似的语句,那么引用这个语句需要什么呢?这就是为什么我们只剥离参考零件

这些语句根本不是表达式。这些是声明。它们确实包含子表达式100和
i
,它们的类型都是
int
。如果在此声明之后使用id表达式
j
,则该表达式的类型将为
int

所以我的问题是指针也会发生类似的情况吗

int x = 34;
int *l = &x; // will this expression have type int* or int?
不是。指针是非引用类型,类似的情况不会发生在具有指针类型的表达式上

为什么我们只剥离参考零件

这就是语言的工作原理。它允许我们以相同的方式对待对象和对对象的引用

这就是为什么不需要(也不能)显式地使用间接运算符访问引用的对象的部分原因,这与需要使用间接运算符访问指向的对象不同


以下是实际语言规则(来自最新标准草案):

[表达式类型]

如果表达式最初具有类型“reference to T”([dcl.ref]、[dcl.init.ref]),则在进行任何进一步分析之前,该类型将调整为T。 表达式指定由引用表示的对象或函数,表达式是左值或x值,具体取决于表达式


C++表达式可以有类似于
j+0
(j)
的形式。这些表达式的类型肯定是
int


为了简化语法,变量名称本身也可用作表达式。如果我们没有这个规则,语法中就会有很多变量或表达式。但这意味着表达式
j
的类型与表达式
j+0
的类型相同,即
int

表达式:表达式由一个或多个操作数组成,并在求值时产生结果

注意“评估时”的措辞

表达式的示例有:文本4或某些变量n。再次注意,表达式尚未计算,因此没有结果。还可以从运算符和一个或多个操作数创建更复杂的表达式。例如,3+4*5是一个未赋值的表达式。具有两个或多个运算符的表达式称为复合表达式

<> > C++中的每个表达式是rValor或LVal.< /P>
表达式语句:语句以分号结尾。当我们向表达式中添加分号时,它将成为表达式语句。其影响是,这会导致表达式求值,并在语句末尾丢弃其结果。例如,文字5是一个表达式,但如果添加分号;在它之后,我们将有一个表达式语句。此外,此表达式的结果将在表达式语句末尾被丢弃。让我们看另一个例子,
cout引用的语句来自哪里?正如你所说的那样,这似乎不是真的。它是在哪里写的?你能分享一下这个链接吗?引用的声明来自。检查页面顶部的第2行。整个短语是:“每个表达式都有一些非引用类型,每个表达式恰好属于三个主要值类别之一:prvalue、xvalue和lvalue。”这反而更有意义。您引用的完整语句的两部分由“and”连接这意味着它们也应该是有意义的@AL3C您提到了副作用,但是语句
cout
int&r=i
是一个定义,因此不可能是表达式语句。但是,它确实包含一个初始值设定项表达式。因为它不是一个表达式语句,所以没有被丢弃的值。与
int*p=&i
相同。是的,它们都是声明语句。因此,任何东西都不会被丢弃。