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?
...全文
219 13 打赏 收藏 转发到动态 举报
写回复
用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“所指向的对象啊”

64,651

社区成员

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

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