理解Moothy第2.21节发布的C++初级读本第五版解决方案
Understanding C++ Primer 5th ed solution posted by Moothy section 2.21
我是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"不是指针,则值将被强制转换,但因为您使用的是指针而不是变量,所以这不起作用。
不要想太多给定的答案:这是编译器语言,你会得到很多这样的句子,但现在不要关心它们。
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 为什么“从'x*'到'y'失去精度”是一个硬错误,什么是适合旧版代码的解决方案
- 在VS2015社区版(C++)中从项目/解决方案中创建可执行文件
- 理解Moothy第2.21节发布的C++初级读本第五版解决方案