cout输出操作符求值顺序
2011-12-06 13:40
225 查看
在逛论坛的时候发现这个问题的,然后就动手查了下,也写了下代码测试
不过首先应该声明的是 : c++中对于cout后面的表达式的求值顺序是未定义的,具体的运行结果要由编译器的实现来决定.
本人是在vc++ 6.0下编译的.
测试代码:
输出结果: 123 (第一个cout语句)
321 (第二个cout语句)
因为在我所用的编译器下 cout后的表达式求值是从右向左的, 所以从右向左三个fun()函数的值分别是1, 2, 3
三个fun函数执行后的结果入栈. 如图:
然后从栈顶取值, 输出 3 2 1
同样的对于getchar的例子,
如果输入的是 ab , 先从右边的getchar()函数开始读取, 因面右边的读的是a, 左边的读的是b, 入栈后
输出时从栈顶依次取值, 输出 b a
总结:1 该现象在c++标准中是未定义行为, 运行结果完全取决于编译器实现
2 在6.0中是先从右向左计算各表达式的值后入栈, 然后从栈顶取值输出.
3 此规则也适用于其它的一些输出函数或表达式.
不过首先应该声明的是 : c++中对于cout后面的表达式的求值顺序是未定义的,具体的运行结果要由编译器的实现来决定.
本人是在vc++ 6.0下编译的.
测试代码:
#include <iostream> using namespace std; int fun() { static int xx = 0; ++xx; return xx; } int main(void) { int a=1, b=2, c=3; char x, y; cout << a << b << c << endl; cout << fun() << fun() << fun() << endl; cout << (x = getchar()) << (y = getchar()) << endl; return 0; }
输出结果: 123 (第一个cout语句)
321 (第二个cout语句)
因为在我所用的编译器下 cout后的表达式求值是从右向左的, 所以从右向左三个fun()函数的值分别是1, 2, 3
三个fun函数执行后的结果入栈. 如图:
然后从栈顶取值, 输出 3 2 1
同样的对于getchar的例子,
如果输入的是 ab , 先从右边的getchar()函数开始读取, 因面右边的读的是a, 左边的读的是b, 入栈后
输出时从栈顶依次取值, 输出 b a
总结:1 该现象在c++标准中是未定义行为, 运行结果完全取决于编译器实现
2 在6.0中是先从右向左计算各表达式的值后入栈, 然后从栈顶取值输出.
3 此规则也适用于其它的一些输出函数或表达式.
相关文章推荐
- C++中,cout操作符求值顺序
- C++输出操作符求值顺序
- C++输出流cout的顺序问题
- C++输出流cout的执行顺序问题
- C++中规定了求值顺序的操作符
- cout的输出顺序
- C/C++中操作符的优先级和求值顺序
- C++,重载输出操作符<<, cout.operator()
- cout的输出顺序与其中表达式的执行顺序,以及自增操作优先级
- cout输出顺序
- 关于c++ cout输出顺序问题。
- cout输出流的执行顺序
- Maximum Product Subarray 以及cout的输出顺序问题的讨论
- cout输出中多个表达式的先后执行顺序与输出顺序
- 操作符求值顺序
- cout输出流的执行顺序
- cout中表达式的先后执行顺序与输出顺序
- C++ cout 输出顺序
- 一个证明表达式的求值顺序只是部分由操作符的优先级决定的程序
- 表达式运算顺序与求值顺序,副作用操作符(++,--),序列点