c++中,多个要输出的数据写在一个cout中的问题?
在VC++6.0中inta=10;语句cout<<a<<","<<a++<<endl;输出是11,10书上说"是从右到左计算各输出项的值,然后,从左到右输出各项的值"。但...
在VC++6.0中
int a=10;
语句 cout<<a<<","<<a++<<endl;
输出是 11,10
书上说"是从右到左计算各输出项的值,然后,从左到右输出各项的值"。
但我想不明白 "<<a++<<" 输出的是 a 的值
而 <<a<< 输出的才是 a++ 的值?
请求高手帮助! 展开
int a=10;
语句 cout<<a<<","<<a++<<endl;
输出是 11,10
书上说"是从右到左计算各输出项的值,然后,从左到右输出各项的值"。
但我想不明白 "<<a++<<" 输出的是 a 的值
而 <<a<< 输出的才是 a++ 的值?
请求高手帮助! 展开
4个回答
展开全部
C++的STL中cout的“<<”输出对象是通过运算符重载实现的。运算符重载不能改变运算符原有的优先级和结合顺序。<<具有左结合性,即连续的<<表达式中先执行左边的<<得到结果后,再代入后继表达式的值,执行接下来的<<(这里的“执行”指执行重载实现里的输出指令)。
<<的左操作数是输出对象cout或它的引用;右操作数可以是不同的类型,根据数据类型选择不同的输出过程以便正确地输出值;同时cout的<<运算也有返回值,为cout自身的引用,可以这样就能通过上面的嵌套来输出多个值。
cout<<a<<","<<a++<<endl;这条语句明确计算顺序,应该是:
(((cout<<a)<<",")<<a++)<<endl;,而++优先级显然比<<运算符高,因此解析到++时候会优先计算++。不过,这里++位于运算对象的右边,所以代入表达式的a是没有自增的a的原值,也就是10;代入之后a自增1,等于11。
但是要注意,尽管代入表达式的顺序(不是LS所说的入栈顺序,这里的顺序决定具体传递哪个参数,在传递参数之前决定,和传递参数本身的顺序无关;传递参数和恢复堆栈的方式由调用约定(诸如__cdecl或是__stdcall)确定)是由优先级(以上的括号)定死的,但在此之前的需要代入表达式的各个不同子表达式之间的求值顺序并不是确定的,不同的编译环境下可以有不同的行为。例如在Dev-C++下测试结果为10,10,而VS2008下的情况和LZ所说相同。出现LZ的情况时,这条语句等价于:
(((cout<<11)<<",")<<10)<<endl;。
可见传递进<<是a的引用,先计算了a++,然后再代入了前面的部分,最后整体输出。对于这种标准中没有定义,平台实现可以有差异的涉及了多个序列点(a++运算符副作用表达式和a这个表达式之间形成两个序列点)不明确的情形,完全不必纠结其中的求值顺序——这是没有意义的。事实上,现实程序设计中应该尽量避免这种使用,以免出错。
而输出顺序从左到右,是预先定义的,由cout的<<重载运算符内部实现(至于这样定义的原因,是为了使表达式直观地符合顺序输出的语义)。
====
[原创回答团]
<<的左操作数是输出对象cout或它的引用;右操作数可以是不同的类型,根据数据类型选择不同的输出过程以便正确地输出值;同时cout的<<运算也有返回值,为cout自身的引用,可以这样就能通过上面的嵌套来输出多个值。
cout<<a<<","<<a++<<endl;这条语句明确计算顺序,应该是:
(((cout<<a)<<",")<<a++)<<endl;,而++优先级显然比<<运算符高,因此解析到++时候会优先计算++。不过,这里++位于运算对象的右边,所以代入表达式的a是没有自增的a的原值,也就是10;代入之后a自增1,等于11。
但是要注意,尽管代入表达式的顺序(不是LS所说的入栈顺序,这里的顺序决定具体传递哪个参数,在传递参数之前决定,和传递参数本身的顺序无关;传递参数和恢复堆栈的方式由调用约定(诸如__cdecl或是__stdcall)确定)是由优先级(以上的括号)定死的,但在此之前的需要代入表达式的各个不同子表达式之间的求值顺序并不是确定的,不同的编译环境下可以有不同的行为。例如在Dev-C++下测试结果为10,10,而VS2008下的情况和LZ所说相同。出现LZ的情况时,这条语句等价于:
(((cout<<11)<<",")<<10)<<endl;。
可见传递进<<是a的引用,先计算了a++,然后再代入了前面的部分,最后整体输出。对于这种标准中没有定义,平台实现可以有差异的涉及了多个序列点(a++运算符副作用表达式和a这个表达式之间形成两个序列点)不明确的情形,完全不必纠结其中的求值顺序——这是没有意义的。事实上,现实程序设计中应该尽量避免这种使用,以免出错。
而输出顺序从左到右,是预先定义的,由cout的<<重载运算符内部实现(至于这样定义的原因,是为了使表达式直观地符合顺序输出的语义)。
====
[原创回答团]
参考资料: 原创
展开全部
这主要是需要你理解a++和++a的区别:
1.a++: 先返回a的值, 再计算a=a+1
1.++a: 先计算a=a+1,再返回a的值
cout<<a<<","<<a++<<endl;
这个函数经历了如下步骤.
1.最右侧a++首先输出了a的值:10
2.a=a+1使得a=11.
3.左边的cout<<a返回了a=11;
希望对你有帮助
1.a++: 先返回a的值, 再计算a=a+1
1.++a: 先计算a=a+1,再返回a的值
cout<<a<<","<<a++<<endl;
这个函数经历了如下步骤.
1.最右侧a++首先输出了a的值:10
2.a=a+1使得a=11.
3.左边的cout<<a返回了a=11;
希望对你有帮助
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这主要是需要你理解a++和++a的区别:
1.a++:
先返回a的值,
再计算a=a+1
1.++a:
先计算a=a+1,再返回a的值
cout<<a<<","<<a++<<endl;
这个函数经历了如下步骤.
1.最右侧a++首先输出了a的值:10
2.a=a+1使得a=11.
3.左边的cout<<a返回了a=11;
希望对你有帮助
1.a++:
先返回a的值,
再计算a=a+1
1.++a:
先计算a=a+1,再返回a的值
cout<<a<<","<<a++<<endl;
这个函数经历了如下步骤.
1.最右侧a++首先输出了a的值:10
2.a=a+1使得a=11.
3.左边的cout<<a返回了a=11;
希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个问题不必太过追求
对于不通的编译器,得出来的结果并不一样
首先,入栈顺序,从右往左
但是在入栈前的计算顺序没有明确规定,依编译器而定
你可以参考下
http://topic.csdn.net/u/20080903/22/2fc92c6c-cf27-4b98-a6e2-c125c57ad827.html
对于不通的编译器,得出来的结果并不一样
首先,入栈顺序,从右往左
但是在入栈前的计算顺序没有明确规定,依编译器而定
你可以参考下
http://topic.csdn.net/u/20080903/22/2fc92c6c-cf27-4b98-a6e2-c125c57ad827.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询