C++primer 习题6.13

showqsy 2012-12-24 05:54:52
详细解释下面while循环中的语句是如何执行的:
*dest++=*source++;

答案的说法是:1.指针dest加1;2.指针source加1;3.将source原来所指向的对象赋给source原来所指向的对象。

疑问:++的优先级比*的优先级高,而且结合顺序是从右至左。 不是应该是dest加1,source加1吗?
为什么是指针加1?
...全文
227 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
suifeng3702 2012-12-26
  • 打赏
  • 举报
回复
楼主把指针和解引用操作符搞混了~~~
卖萌de猫 2012-12-26
  • 打赏
  • 举报
回复
dest 和source不就是指针么~
szulee 2012-12-26
  • 打赏
  • 举报
回复
引用 7 楼 zhangxun2007 的回复:
具体分解:*dest++=*source++; tmpcon=*source; source=source+1; *dest=tmpcon; dest=dest+1;
。。这分解的有点累赘 *dest++=*source++; 等价于: *dest=*source; dest++; source++;
zhangtonghui816 2012-12-25
  • 打赏
  • 举报
回复
引用 楼主 showqsy 的回复:
详细解释下面while循环中的语句是如何执行的: *dest++=*source++; 答案的说法是:1.指针dest加1;2.指针source加1;3.将source原来所指向的对象赋给source原来所指向的对象。 疑问:++的优先级比*的优先级高,而且结合顺序是从右至左。 不是应该是dest加1,source加1吗? 为什么是指针加1? ……
指针就是地址
David_Hu 2012-12-25
  • 打赏
  • 举报
回复
*d++=*c++; 00413636 mov eax,dword ptr [d] 00413639 mov ecx,dword ptr [c] 0041363C mov dl,byte ptr [ecx] 0041363E mov byte ptr [eax],dl 00413640 mov eax,dword ptr [d] 00413643 add eax,1 00413646 mov dword ptr [d],eax 00413649 mov ecx,dword ptr [c] 0041364C add ecx,1 0041364F mov dword ptr [c],ecx 第一次跟汇编,VS2005,PC上 好像是*d=*c d++ c++ 不知道我分析的对不
zhangxun2007 2012-12-25
  • 打赏
  • 举报
回复
具体分解:*dest++=*source++; tmpcon=*source; source=source+1; *dest=tmpcon; dest=dest+1;
zhangxun2007 2012-12-25
  • 打赏
  • 举报
回复
另外,++运算的操作数是一个变量,书上称为左值运算。如果先做*号运算,那么得到一个具体的值 怎么可以给一个值做++运算呢?
zhangxun2007 2012-12-25
  • 打赏
  • 举报
回复
应该是,先后++,得到一个临时值(就是变量当前地址),取其地址内容,然后变量地址后移一单位。 如果做过,C++中的运算符重载,应该不陌生。
virtualxmars 2012-12-25
  • 打赏
  • 举报
回复
引用 7 楼 zhangxun2007 的回复:
具体分解:*dest++=*source++; tmpcon=*source; source=source+1; *dest=tmpcon; dest=dest+1;
严格来说应该是: pointer_type tmpSource, tmpDest; tmpSource = source; source += 1; tmpDest = dest; dest += 1; *tmpDest = *tmpSource;
bingkilnara 2012-12-24
  • 打赏
  • 举报
回复
a++返回a ++a返回a+1
oniisama 2012-12-24
  • 打赏
  • 举报
回复
看书不认真了吧,++和--有前置和后置之分
virtualxmars 2012-12-24
  • 打赏
  • 举报
回复
C++很多操作符都是可被重载的,而且其优先级不变。可以利用这一点来验证你的问题: 代码:

#include <string>
using namespace std;

class Number 
{
private:
	string name;
public:
	Number(const string& name)
	{
		cout<<"构造"<<name<<endl;
		this->name = name;
	}

	// 后递增的操作符重载方法必须定义一个无用的int参数
	Number operator ++(int)
	{
		cout<<"{"<<name<<"} Number::operator++"<<endl;

		return Number(name + "Copy");
	}

	Number& operator=(const Number& rhs)
	{
		cout<<"{"<< name<<"} Number::operator="<<endl;
		return *this;
	}

	Number& operator*()
	{
		cout<<"{"<< name<<"} Number::operator*"<<endl;
		return *this;
	}
};


int main() {
	Number dest("dest"), source("source");
	*dest++ = *source++;

	return 0;
}
输出结果: 构造dest 构造source {source} Number::operator++ 构造sourceCopy {sourceCopy} Number::operator* {dest} Number::operator++ 构造destCopy {destCopy} Number::operator* {destCopy} Number::operator= 从该结果可以得到以下结论: 1.由于赋值操作符的结合顺序是从右到左,所以先执行的是它右边的表达式计算,即(*source++) 2.由于++(后递增)比*(解引用)优先级高,所以先执行的是++,然后再解引用 3.虽然dest加了1,(source也加了1),但由于C++的标准来说,后递增必须返回一个数据的副本,而不是数据本身,而该副本通常保留了执行递增操作前的数据内容。所以,虽然source和dest都进行了+1操作,但因为返回的副本对象实际上保留的是之前的数据。 4.书上的标准答案并不严谨。首先执行的应该是source++
abc41106 2012-12-24
  • 打赏
  • 举报
回复
对的啊,就是dest加1,source加1啊 dest,source不就是指针么 *dest是dest“所指向的对象啊”
1.下载和安装VC++2008 2.下载和安装VC++2010 3.第1章 快速入门 4.第2章 基本内置类型 5.第2章 重点习题解答 6.第2章 字面值常量 7.第2章 变量 8.第2章 变量名 9.第2章 定义对象 10.第2章 声明和定义 11.第2章 名字的作用域 12.第2章 const 限定符 13.第2章 引用 14.第2章 typedef 15.第2章 枚举 16.第2章 类类型 17.第2章 编写自己的头文件 18.第3章 命名空间的using声明 19.第3章 标准库 string 类型 (1) 20.第3章 标准库 string 类型 (2) 21.第3章重点习题解答 22.第3章标准库string类型(3) 23.第3章标准库vector类型 24.第3章重点习题解答 25.第3章迭代器简介 26.二进制和十六进制 27.第3章标准库bitset类型 28.标准库bitset应用实例 29.第4章数组 30.第4章指针的引入 31.第4章使用指针操作数组元素 32.第4章指针和const限定符 33.第4章C风格字符串 34.第4章创建动态数组 35.第4章新旧代码的兼容 36.第4章多维数 37.第5章算术操作符 38.第5章关系操作符和逻辑操作符 39.第5章位操作符 40.第5章赋值操作符 41.第5章自增和自减操作符 42.第5章箭头操作符 43.第5章条件操作符和逗号操作符 44.第5章new和delete表达式 45.第5章显式转换 46.第6章简单语句 47.第6章if语句 48.第6章switch语句 49.第6章while语 50.第6章for语句 51.第6章dowhile语句 52.第6章break,continue,goto语句 53.第6章6.13try块和异常处理 54.第6章6.13.3标准异常 55.第6章6.14使用预处理器进行调试 56.第7章函数的定义 57.第7章参数传递-非引用形参 58.第7章参数传递-引用参数 59.第7章参数传递-vector和其他容器类型的形参 60.第7章参数传递-数组形参 61.第7章main处理命令行选项 62.第7章return语句 63.第7章递归 64.第7章函数声明 65.第7章局部对象 66.第7章内联函数 67.第7章类的成员函数 68.第7章类的构造函数 69.第7章重载函数 70.第7章重载与作用域 71.第7章重载函数函数匹配 72.第7章重载函数实参转换 73.第7章指向函数的指针 74.第8章面向对象的标准IO库 75.第8章条件状态 76.第8章文件流对象的使用 77.第8章重点习题解答 78.第8章文件模式 79.第8章一个打开并检查输入文件的程序 80.第8章字符串流
C++ primer 第4版 原书+习题解答+源码 清晰pdf,非影印。 本书是久负盛名的C++经典教程引,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。   本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++先驱Barbara E.Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。   对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。   第1章 快速入门   1.1 编写简单的C++程序   1.2 初窥输入/输出   1.3 关于注释   1.4 控制结构 入   1.5 类的简介   1.6 C++程序   小结   术语   第一部分 基本语言   第2章 变量和基本类型   2.1 基本内置类型   2.2 字面值常量   2.3 变量   2.4 const限定符   2.5 引用   2.6 typedef名字   2.7 枚举   2.8 类类型   2.9 编写自己的头文件   小结   术语   第3章 标准库类型   3.1 命名空间的using声明   3.2 标准库string类型   3.3 标准库vector类型   3.4 迭代器简介   3.5 标准库bitset类型   小结   术语   第4章 数组和指针   4.1 数组   4.2 指针的引入   4.3 C风格字符串   4.4 多维数组   小结   术语   第5章 表达式   5.1 算术操作符   5.2 关系操作符和逻辑操作符   5.3 位操作符   5.4 赋值操作符   5.5 自增和自减操作符   5.6 箭头操作符   5.7 条件操作符   5.8 sizeof操作符   5.9 逗号操作符   5.10 复合表达式的求值   5.11 new和delete表达式   5.12 类型转换   小结   术语   第6章 语句   6.1 简单语句   6.2 声明语句   6.3 复合语句(块)   6.4 语句作用域   6.5 if语句   6.6 switch语句   6.7 while语句   6.8 for循环语句   6.9 do while语句   6.10 break语句   6.11 continue语句   6.12 goto语句   6.13 try块和异常处理   6.14 使用预处理器进行调试   小结   术语   第7章 函数   7.1 函数的定义   7.2 参数传递   7.3 return语句   7.4 函数声明   7.5 局部对象   7.6 内联函数   7.7 类的成员函数   7.8 重载函数   7.9 指向函数的指针   小结   术语   第8章 标准IO库   8.1 面向对象的标准库   8.2 条件状态   8.3 输出缓冲区的管理   8.4 文件的输入和输出   8.5 字符串流   小结   术语   第二部分 容器和算法   第9章 顺序容器   第10章 关联容器   第11章 泛型算法   第三部分 类和数据抽象   第12章 类   第13章 复制控制   第14章 重载操作符与转换   第四部分 面向对象编程与泛型编程   第15章 面向对象编程   第16章 模板与泛型编程   第五部分 高级主题   第17章 用于大型程序的工具   第18章 特殊工具与技术   附录 标准库   索引

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧