首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

cout有关问题

2012-04-16 
cout问题在学定位new表达式时输出遇到了奇怪的现象C/C++ codeint main(){allocatorstring cllstring *s

cout问题
在学定位new表达式时输出遇到了奇怪的现象

C/C++ code
int 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++ code
cout<<*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 有没有在它被求值之前被求值.
总之就是我发的那个链接说明的问题.,


热点排行