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, 再输出
<< 这个操作符号 是从右边开始的
第一句 先有 i=10的,再有 i++,等计算好,再输出,
第二句 先有 i=1的,在计算 --1, 再输出
#2
G++ 编译器 输出
10,11
10,10
和我 上面想的不一样,看来还是要看编译器
10,11
10,10
和我 上面想的不一样,看来还是要看编译器
#3
LZ用的是什么编译器,我用vs2008出来的结果是:
10,11
10,10
没错啊!!!
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’上的运算结果可能是未定义的
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
这种东西还是少用
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;
}
因为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
这个好像是我同学的嘛
#11
这个理解我认可,我也是这么想的
#12
编译器的问题
#13
cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;
这个结果编译器决定的。
cout<<--i<<','<<i<<endl;
这个结果编译器决定的。
#14
我用的是vc++6.0编译的,看来输出结果和编译器有很大关系的。第一次在csdn发贴,就得到各位解答,很感谢!
#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,以此类推。即<<的结合性是从左至右的
具有“副作用”的是++(含--,包括前置++、--和后置++、--),=(包括+=、-=等)和函数调用(可能利用指针、引用改值)。
那么在一个表达式中出现对一个变量的两次“副作用”,结果是要依赖许多因素的:
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, 再输出
<< 这个操作符号 是从右边开始的
第一句 先有 i=10的,再有 i++,等计算好,再输出,
第二句 先有 i=1的,在计算 --1, 再输出
#2
G++ 编译器 输出
10,11
10,10
和我 上面想的不一样,看来还是要看编译器
10,11
10,10
和我 上面想的不一样,看来还是要看编译器
#3
LZ用的是什么编译器,我用vs2008出来的结果是:
10,11
10,10
没错啊!!!
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’上的运算结果可能是未定义的
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
这种东西还是少用
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;
}
因为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
这个好像是我同学的嘛
#11
这个理解我认可,我也是这么想的
#12
编译器的问题
#13
cout<<i++<<','<<i<<endl;
cout<<--i<<','<<i<<endl;
这个结果编译器决定的。
cout<<--i<<','<<i<<endl;
这个结果编译器决定的。
#14
我用的是vc++6.0编译的,看来输出结果和编译器有很大关系的。第一次在csdn发贴,就得到各位解答,很感谢!
#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,以此类推。即<<的结合性是从左至右的
具有“副作用”的是++(含--,包括前置++、--和后置++、--),=(包括+=、-=等)和函数调用(可能利用指针、引用改值)。
那么在一个表达式中出现对一个变量的两次“副作用”,结果是要依赖许多因素的:
a。优先级
b。结合性
c。运算顺序
可能影响最大的是运算顺序,因为a、b有较严格的定义,而运算顺序取决于编译器的实现,编译器编写者可能利用了数学的结合性(如a+b+c,先做a+b或先做b+c效果一样,但a、b、c是含“副作用”的表达式,效果就不一样了),或者使用他认为是效率高的顺序。
教程上的这种题目应该丢弃,有“副作用”就要将“副作用”限制在最小范围内(一个表达式中不要对一个含有“副作用”的变量做两次或更多次的使用!)
“副作用”又依赖于编译器实现,从一个编译器中获得的“知识点”决不是“普遍规律”。
======================
LS有人对<<的认识也有不对的:
cout<<a 的结果是cout,所以可以递归使用
(cout<<a)<<b,b也送给了cout,以此类推。即<<的结合性是从左至右的