请教一个关于 ++ 的小问题~

蜡笔大龙猫 2012-04-14 01:18:08
我以前一直是这样以为的:在一条语句里,前++在语句之前执行,后++在语句之后执行。

可最近发现这个理解是错误的,应该是:前++ 和 后++ 都比 = 的运算优先级高。前++ 返回一个引用,是执行了 ++ 后的 a 的值,是一个左值,后++ 返回一个const对象,是执行 ++ 之前 a 的值,是一个右值。

那么,我对如下代码有疑问。

int a = 5;

a = a + ( a++ );

我觉得这个 a 应该输出 11,因为 a++ 先执行,a 的值为 6 了,但 a++ 返回 5,所以 5 + 6 = 11,执行,正确。

int a = 5;

int b = a + ( a++ );

按我的思路理解,b 应该是 11,可实际运算 b 却是 10,为什么呢?
...全文
245 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2013-03-18
  • 打赏
  • 举报
回复
二十多年前发布的c89早就有说明了 3.3 Expressions Except as indicated by the syntax27 or otherwise specified later (for the function-call operator (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.
lin5161678 2013-03-17
  • 打赏
  • 举报
回复
引用 12 楼 paschen 的回复:
a = a + ( a++ ); ++在右边是在整个公式之后a才自加1 所以公式是a=a+a;然后a++ 所以是11 而换成b自然就不是了,楼主应该理解错了 另一般也不意见写成这种的,最好不要再一个表达式中改变同一个变量超过两次, 否则迟早会遇到问题。 这篇帖子解释了++什么时候起作用,写得很好,虽然和楼主主题不太相关,但推荐看一下: http……
于是 你看了置顶的帖子 然后还是不懂帖子什么意思对吧 a = a + ( a++ ); ++在右边是在整个公式之后a才自加1 所以公式是a=a+a;然后a++ 所以是11 这句话话说错了 明白序列点和副作用的人 不会这样理解
落叶涟漪 2013-03-17
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/370153775 请看置顶帖
jielin2012 2013-03-17
  • 打赏
  • 举报
回复
加括号是最好的办法
wanggongcun 2013-03-16
  • 打赏
  • 举报
回复
看看这个啊http://bbs.csdn.net/topics/370153775
Aulilino 2013-03-16
  • 打赏
  • 举报
回复
编译器问题...
jimette 2013-03-16
  • 打赏
  • 举报
回复
这种帖子 你工作以后很少用到 直接反汇编看
dezhonger 2013-03-16
  • 打赏
  • 举报
回复
完全不必纠结于这些,本身这样写就是很不好的编程习惯。而且,在不用的编译器下同样的式子也会输出不同的结果。
erqieshi 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用楼主 的回复:
我以前一直是这样以为的:在一条语句里,前++在语句之前执行,后++在语句之后执行。

可最近发现这个理解是错误的,应该是:前++ 和 后++ 都比 = 的运算优先级高。前++ 返回一个引用,是执行了 ++ 后的 a 的值,是一个左值,后++ 返回一个const对象,是执行 ++ 之前 a 的值,是一个右值。

那么,我对如下代码有疑问。

int a = 5;……
[/Quote]
正确
楼主的测试用例区分度不够
试试以下例子

int a = 5;
a = 3 * a + 4 * (a++);
cout<<a;//按楼主的理解,输出 3 * 5 + 4 * 6 = 39//事实是36 3 * 5 + 4 * 5 = 35 35++ = 36
a = 5;
int b = 3 * a + 4 * (a++);
cout<<b;

输出36 35
max_min_ 2012-04-22
  • 打赏
  • 举报
回复
哥们,那就12了[Quote=引用楼主 的回复:]
我以前一直是这样以为的:在一条语句里,前++在语句之前执行,后++在语句之后执行。

可最近发现这个理解是错误的,应该是:前++ 和 后++ 都比 = 的运算优先级高。前++ 返回一个引用,是执行了 ++ 后的 a 的值,是一个左值,后++ 返回一个const对象,是执行 ++ 之前 a 的值,是一个右值。

那么,我对如下代码有疑问。

int a = 5;

a = a + (……
[/Quote]
逆水痕 2012-04-22
  • 打赏
  • 举报
回复
++i与i++的主要区别在于:
++i;他是在使用i之前加1;
i++在于;他是在使用i之后加1;
a=5;
b=a+(a++);
依照他们的区别这个结果显而易见的。
paschen 版主 2012-04-22
  • 打赏
  • 举报
回复
把那篇帖子和你问题相关的部分复制了出来:


C/C++语言定义(语言的参考手册)明确定义了顺序点的概念。顺序点位于:
1. 每个完整表达式结束时。完整表达式包括变量初始化表达式,表达式语句,return语句的表达式,以及条件、循环和switch语句的控制表达式(for头部有三个控制表达式);
2. 运算符 &&、||、?: 和逗号运算符的第一个运算对象计算之后;
3. 函数调用中对所有实际参数和函数名表达式(需要调用的函数也可能通过表达式描述)的求值完成之后(进入函数体之前)。
paschen 版主 2012-04-22
  • 打赏
  • 举报
回复
++在右边是在整个公式之后a才自加1
括号也决定不了它
paschen 版主 2012-04-22
  • 打赏
  • 举报
回复
a = a + ( a++ );
++在右边是在整个公式之后a才自加1
所以公式是a=a+a;然后a++
所以是11

而换成b自然就不是了,楼主应该理解错了
另一般也不意见写成这种的,最好不要再一个表达式中改变同一个变量超过两次,
否则迟早会遇到问题。


这篇帖子解释了++什么时候起作用,写得很好,虽然和楼主主题不太相关,但推荐看一下:
http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html
采石工 2012-04-22
  • 打赏
  • 举报
回复
结论(在VS2008下,在其他平台下未测试)
++i; <=> i++;
这个显而易见
f(i++) <=> f(i);i++;
f(++i) <=> ++i;f(i);
注意这里函数f中可能会改变i的值,但上述结论依然是正确的。

推论:
c=a+b++ <=> c=a+(b++) <=> c=a+b;b++;
c=a+++b <=> c=(a++)+b <=> c=a+b;a++;
c=a+(++b) <=> ++b;c=a+b;
特别地,
a=a+(a++) <=> a=a+a;a++; <=> a=2*a+1;
b=a+(a++) <=> b=a+a;a++;
这个特殊情形或许可以解决楼主的疑惑!

下面是我的测试例子

#include<iostream>
using namespace std;
void f(int i)
{
cout<<i<<endl;
}
int main()
{
int i=10;
f(i++);
cout<<i<<endl;
i=10;
f(++i);
cout<<i<<endl;
return 0;
}

在VS2008下的输出结果为

10
11
11
11

另一个测试例子

#include<iostream>
using namespace std;

int main()
{
int a,b;

a=5;
a=a+a++;
cout<<a<<endl;
a=5;
a=a+++a;
cout<<a<<endl;
a=5;
a=a+(++a);
cout<<a<<endl<<endl;

a=5;
b=a+a++;
cout<<a<<endl;
cout<<b<<endl;
a=5;
b=a+++a;
cout<<a<<endl;
cout<<b<<endl;
a=5;
b=a+(++a);
cout<<a<<endl;
cout<<b<<endl;

return 0;
}

输出结果为

11
11
12

6
10
6
10
6
12
iamnobody 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

a = a + ( a++ );
++在右边是在整个公式之后a才自加1
所以公式是a=a+a;然后a++
所以是11

而换成b自然就不是了,楼主应该理解错了
另一般也不意见写成这种的,最好不要再一个表达式中改变同一个变量超过两次,
否则迟早会遇到问题。


这篇帖子解释了++什么时候起作用,写得很好,虽然和楼主主题不太相关,但推荐看一下:
http://topic.csd……
[/Quote]

你根本没看懂这个贴子.... 楼主的写法是错的.

表达式求值顺序
飞流 2012-04-22
  • 打赏
  • 举报
回复
额也是这么认为的
[Quote=引用 15 楼 的回复:]

++i与i++的主要区别在于:
++i;他是在使用i之前加1;
i++在于;他是在使用i之后加1;
a=5;
b=a+(a++);
依照他们的区别这个结果显而易见的。
[/Quote]
采石工 2012-04-21
  • 打赏
  • 举报
回复
赞成!
[Quote=引用 4 楼 的回复:]

引用楼主 的回复:
我以前一直是这样以为的:在一条语句里,前++在语句之前执行,后++在语句之后执行。

可最近发现这个理解是错误的,应该是:前++ 和 后++ 都比 = 的运算优先级高。前++ 返回一个引用,是执行了 ++ 后的 a 的值,是一个左值,后++ 返回一个const对象,是执行 ++ 之前 a 的值,是一个右值。

那么,我对如下代码有疑问。

int a = 5;……
[/Quote]
笨蛋糕 2012-04-14
  • 打赏
  • 举报
回复
b的值肯定是10啦,a最后的值是11.
a++表示先把a以5输出去和a相加,最后在输出a++也就是6的值,那不就是5+5==10了吗?
jiaoyang12345 2012-04-14
  • 打赏
  • 举报
回复
编译器问题。。
加载更多回复(7)

64,637

社区成员

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

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