cout有关问题
cout问题在学定位new表达式时输出遇到了奇怪的现象C/C++ codeint main(){allocatorstring cllstring *s
cout问题
在学定位new表达式时输出遇到了奇怪的现象
C/C++ codeint main(){ allocator<string> cll; string *s=cll.allocate(2); new (s) string(string("123456")); string *m=s; new (++s) string(string("abcdefg")); cout<<*s<<endl<<*--s<<endl; cout<<endl; return 0;}这样的输出是123456123456
而我将输出该为
C/C++ codecout<<*s<<endl;cout<<*--s<<endl这样的输出是abcdefg123456
为什么会有不同的输出呢?为什么第一种输出未达要求呢?是cout的有什么讲究吗?
[解决办法]cout<<是函数调用,而*s这些是参数。而*s,*--s这些表达式在作为参数输入前必须先运算求值。问题就出现在*s和*--s的运算先后顺序问题上。如果你还没弄清楚就看看2楼发的链接。去看看
[解决办法]回楼上,<C++标准程序库>在这句话的翻译得不好.
"operator<<的计算顺序是从左往右。。。请注意这个操作符的计算次序和其参数的计算次序并无关联,纯粹就只是操作符本身的计算顺序(译注请你思考cout<<i++<<i--;的结果,体会上句话的精义,同时容我提醒这个试子在不同的平台可能有不同的结果)"
应该改成:
"operator<<的结合性是从左往右。。。。请注意这个操作符的结合性和其参数的求值次序并无关联,纯粹就只是操作符本身的结合性(译注请你思考cout<<i++<<i--;的结果,体会上句话的精义,同时容我提醒这个试子在不同的平台可能有不同的结果)"
====
cout<<*s<<endl<<*--s<<endl;
根据结合性等效于
(((cout<<*s)<<endl)<<(*--s))<<endl;
每个 "<<" 先对左操作数求值,还是先对右操作数求值,是不确定的.
这个程序当然是先输出 *s 再输出 *--s;
但是 *s 是多少取决于 *--s 有没有在它被求值之前被求值.
总之就是我发的那个链接说明的问题.,