初学,请教一个简单的小程序输出结果,关于++和--的

时间:2021-08-30 16:39:55
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;
}
我理解结果应为:
10,11
10,10

怎么书上结果和调试结果都是:
10,10
10,11
请教何解?

16 个解决方案

#1


编译说了算,你自己的理解没用的
<< 这个操作符号 是从右边开始的
第一句 先有 i=10的,再有 i++,等计算好,再输出, 
第二句 先有 i=1的,在计算 --1, 再输出

#2


G++ 编译器 输出

10,11
10,10
和我 上面想的不一样,看来还是要看编译器

#3


LZ用的是什么编译器,我用vs2008出来的结果是:
10,11
10,10
没错啊!!!

#4


D:\cc\aa\compare.cpp|7|warning: ‘i’上的运算结果可能是未定义的|
D:\cc\aa\compare.cpp|8|warning: ‘i’上的运算结果可能是未定义的|
||=== 已完成构建: 0 errors, 2 warnings (0 minutes, 4 seconds) ===|
这样的写法不可取, GCC 编译器警告了 ‘i’上的运算结果可能是未定义的

#5


书上总会存在印刷错误!我上课时就那样!

#6


书本有时候是错误的

#7


GCC 编译器 输出
10,11
10,10
GCC 编译器警告了 ‘i’上的运算结果可能是未定义的

VC6.0 编译器输出
10,10
10,11

这种东西还是少用

#8


谈谈我自己的认识,不知道对不;
因为i为10 ,调用cout函数的时候,他是把整个i放进去cout函数去了  所以就整个i不变;当在调用cout时i为11,所以结果为10,11;
LZ试试改成这样就会看出  有些区别了
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<endl;
cout<<i<<endl;
cout<<--i<<endl;
cout<<i<<endl;
}

#9


补充  这样就和预先想法一样了!

#10


这个好像是我同学的嘛
引用 8 楼 mjaiyun 的回复:
谈谈我自己的认识,不知道对不;
因为i为10 ,调用cout函数的时候,他是把整个i放进去cout函数去了 所以就整个i不变;当在调用cout时i为11,所以结果为10,11;
LZ试试改成这样就会看出 有些区别了
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<endl;
cout<<i<<endl;
cout<……

#11


引用 8 楼 mjaiyun 的回复:
谈谈我自己的认识,不知道对不;
因为i为10 ,调用cout函数的时候,他是把整个i放进去cout函数去了 所以就整个i不变;当在调用cout时i为11,所以结果为10,11;
LZ试试改成这样就会看出 有些区别了
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<endl;
cout<<i<<endl;
cout<……


这个理解我认可,我也是这么想的

#12


编译器的问题

#13


cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;

这个结果编译器决定的。

#14


我用的是vc++6.0编译的,看来输出结果和编译器有很大关系的。第一次在csdn发贴,就得到各位解答,很感谢!
引用楼主 blacklychen 的回复:
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;
}
我理解结果应为:
10,11
10,10

怎么书上结果和调试结果都是:
10,10
10,11
请教何解?

#15


我跟你的答案一致呀,我怀疑书上错了。。。

#16


首先应该知道表达式的作用是求值,“副作用”是改变量的值。
具有“副作用”的是++(含--,包括前置++、--和后置++、--),=(包括+=、-=等)和函数调用(可能利用指针、引用改值)。
那么在一个表达式中出现对一个变量的两次“副作用”,结果是要依赖许多因素的:
a。优先级
b。结合性
c。运算顺序
可能影响最大的是运算顺序,因为a、b有较严格的定义,而运算顺序取决于编译器的实现,编译器编写者可能利用了数学的结合性(如a+b+c,先做a+b或先做b+c效果一样,但a、b、c是含“副作用”的表达式,效果就不一样了),或者使用他认为是效率高的顺序。
教程上的这种题目应该丢弃,有“副作用”就要将“副作用”限制在最小范围内(一个表达式中不要对一个含有“副作用”的变量做两次或更多次的使用!)
“副作用”又依赖于编译器实现,从一个编译器中获得的“知识点”决不是“普遍规律”。
======================
LS有人对<<的认识也有不对的:
cout<<a 的结果是cout,所以可以递归使用
(cout<<a)<<b,b也送给了cout,以此类推。即<<的结合性是从左至右的

#1


编译说了算,你自己的理解没用的
<< 这个操作符号 是从右边开始的
第一句 先有 i=10的,再有 i++,等计算好,再输出, 
第二句 先有 i=1的,在计算 --1, 再输出

#2


G++ 编译器 输出

10,11
10,10
和我 上面想的不一样,看来还是要看编译器

#3


LZ用的是什么编译器,我用vs2008出来的结果是:
10,11
10,10
没错啊!!!

#4


D:\cc\aa\compare.cpp|7|warning: ‘i’上的运算结果可能是未定义的|
D:\cc\aa\compare.cpp|8|warning: ‘i’上的运算结果可能是未定义的|
||=== 已完成构建: 0 errors, 2 warnings (0 minutes, 4 seconds) ===|
这样的写法不可取, GCC 编译器警告了 ‘i’上的运算结果可能是未定义的

#5


书上总会存在印刷错误!我上课时就那样!

#6


书本有时候是错误的

#7


GCC 编译器 输出
10,11
10,10
GCC 编译器警告了 ‘i’上的运算结果可能是未定义的

VC6.0 编译器输出
10,10
10,11

这种东西还是少用

#8


谈谈我自己的认识,不知道对不;
因为i为10 ,调用cout函数的时候,他是把整个i放进去cout函数去了  所以就整个i不变;当在调用cout时i为11,所以结果为10,11;
LZ试试改成这样就会看出  有些区别了
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<endl;
cout<<i<<endl;
cout<<--i<<endl;
cout<<i<<endl;
}

#9


补充  这样就和预先想法一样了!

#10


这个好像是我同学的嘛
引用 8 楼 mjaiyun 的回复:
谈谈我自己的认识,不知道对不;
因为i为10 ,调用cout函数的时候,他是把整个i放进去cout函数去了 所以就整个i不变;当在调用cout时i为11,所以结果为10,11;
LZ试试改成这样就会看出 有些区别了
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<endl;
cout<<i<<endl;
cout<……

#11


引用 8 楼 mjaiyun 的回复:
谈谈我自己的认识,不知道对不;
因为i为10 ,调用cout函数的时候,他是把整个i放进去cout函数去了 所以就整个i不变;当在调用cout时i为11,所以结果为10,11;
LZ试试改成这样就会看出 有些区别了
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<endl;
cout<<i<<endl;
cout<……


这个理解我认可,我也是这么想的

#12


编译器的问题

#13


cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;

这个结果编译器决定的。

#14


我用的是vc++6.0编译的,看来输出结果和编译器有很大关系的。第一次在csdn发贴,就得到各位解答,很感谢!
引用楼主 blacklychen 的回复:
#include <iostream.h>
void main()
{
int i=10;
cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;
}
我理解结果应为:
10,11
10,10

怎么书上结果和调试结果都是:
10,10
10,11
请教何解?

#15


我跟你的答案一致呀,我怀疑书上错了。。。

#16


首先应该知道表达式的作用是求值,“副作用”是改变量的值。
具有“副作用”的是++(含--,包括前置++、--和后置++、--),=(包括+=、-=等)和函数调用(可能利用指针、引用改值)。
那么在一个表达式中出现对一个变量的两次“副作用”,结果是要依赖许多因素的:
a。优先级
b。结合性
c。运算顺序
可能影响最大的是运算顺序,因为a、b有较严格的定义,而运算顺序取决于编译器的实现,编译器编写者可能利用了数学的结合性(如a+b+c,先做a+b或先做b+c效果一样,但a、b、c是含“副作用”的表达式,效果就不一样了),或者使用他认为是效率高的顺序。
教程上的这种题目应该丢弃,有“副作用”就要将“副作用”限制在最小范围内(一个表达式中不要对一个含有“副作用”的变量做两次或更多次的使用!)
“副作用”又依赖于编译器实现,从一个编译器中获得的“知识点”决不是“普遍规律”。
======================
LS有人对<<的认识也有不对的:
cout<<a 的结果是cout,所以可以递归使用
(cout<<a)<<b,b也送给了cout,以此类推。即<<的结合性是从左至右的