关于运算符优先级问题

blldw 2008-09-24 12:15:27
#include <iostream>

class Integer {
public:
Integer(int i = 0) : _i(i) {}

Integer& operator++() {
std::cout << "++res is called" << std::endl;
++_i;
return (*this);
}

operator int() {
return _i;
}

private:
int _i;
};

class A {
public:
bool operator*() {
std::cout << "*A is called" << std::endl;
return true;
}

A& operator++(int) {
std::cout << "A++ is called" << std::endl;
return (*this);
}
};

int main()
{
A a;
Integer i;

if (*a++) ++i;

return 0;
}

执行结果为什么是
A++ is called
*A is called
++res is called
而非
*A is called
A++ is called
++res is called
?
...全文
139 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lostbyte2006 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 skyering 的回复:]
更好的办法是忘掉优先级,记得加括号就行了。
[/Quote]
好主意。
skyering 2008-09-24
  • 打赏
  • 举报
回复
更好的办法是忘掉优先级,记得加括号就行了。
wangdeqie 2008-09-24
  • 打赏
  • 举报
回复
因为不存在((*a)++),所以肯定是先++,再*
lizhaochai 2008-09-24
  • 打赏
  • 举报
回复
++的优先级比*要高,所以先执行A++
blldw 2008-09-24
  • 打赏
  • 举报
回复
在我的例子中,++作为后置自增使用,其原则应为“先使用,再自增”,即应该先*a, 然后在a++,我在A中同时提供了这两种运算符的重载,但输出结果显示不是先*a,再a++。

我们在作经典的字符串拷贝时都是这样写
char* docpy(char *dst, const char *src)
{
char *tmp = dst;

while (*tmp++ = *src++);

return dst;
}

其中的*tmp++和*src++,都是先使用,即*tmp = *src,然后再自增,即tmp++, src++。
如果按照++运算符优先级比*高,那么运行结果就是不对的了,起码src中的第一个字符没有拷贝到dst中去。

欢迎大家再进行讨论~~~~

65,187

社区成员

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

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