理解Moothy第2.21节发布的C++初级读本第五版解决方案

Understanding C++ Primer 5th ed solution posted by Moothy section 2.21

本文关键字:五版 解决方案 初级读本 Moothy 21节 理解 C++      更新时间:2023-10-16

我是C++新手,正在学习第2章的练习。
我有一个关于练习2.21的问题。
这个解决方案是由Moothy在GitHub 上找到的

练习2.21
解释以下每个定义
请说明是否有违法行为,如果有,请说明原因
int i=0
(a( 双*dp=&i
答案:
(a( :非法,无法使用类型为"int*"的右值

我不明白答案的最后一部分"..int的右值">
&i是变量i的地址,从来不是这里提到的指针
为什么他会在这里提到一个指针?为什么指针的右值指向int?

int*表示可以包含整数地址的变量变量现在,将一个整数变量的地址放在右边则左手边应为int*否则会给出错误的结果。这里就是这么说的。


指针在哪里?dp是一个指针,但不是整数指针,这就是错误的原因。

rvalue—出现在赋值运算符的rhs中的值。A=B(r值(

你知道我们为什么需要不同的指针吗?假设你有一个指针指向一组整数的变量。

BBBBBBB (bytes) 
| 
pointer(p) 
BBBBBBB (bytes) 
   |
   p+1 if pointing to int
BBBBBBB
 |
 p+1 if ointing to char 

现在,如果我们说p++,那么我们要移动到哪里。好的,如果它指向int move(sizeof(int((4字节,如果字符1字节。现在说你被允许做错误的r值分配那么这将是非常有问题的。你必须小心足够正确地编码。

现在希望你了解整个情况。

注意:看,它说你不能用r-value of int*初始化double *int *的r值是多少?它是一个整数变量的地址。所以你给double pointer an r-value of int*赋值,而不是double*的r值,它是double的地址。

来自MSDN

每个C++表达式都是一个左值或一个右值。左值指的是一个持续存在于单个表达式之外的对象。你可以把左值想象成一个有名字的对象。所有变量,包括不可修改(const(变量在内的变量都是lvalue。右值是在使用的表达式之外不会持久存在的临时值为了更好地理解左值和右值之间的区别,考虑以下示例:

示例

有关进一步的示例/澄清,请检查此SO问题

右值和左值之间的精确差异

'dp'是一个指向双值的指针,代码希望它指向一个整数值。这根本不起作用。如果"dp"answers"i"不是指针,则值将被强制转换,但因为您使用的是指针而不是变量,所以这不起作用。

不要想太多给定的答案:这是编译器语言,你会得到很多这样的句子,但现在不要关心它们。

相关文章: