返回信息流int ch[3]={1,2,3};
int *p=ch;
int *q=ch;
cout<<*p++<<" "<<*++p<<endl;
cout<<*q++<<" "<<*q++<<endl;
这是一条镜像帖。来源:北邮人论坛 / cpp / #46501同步于 2010/11/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
高手,求输出和讲解
gv404
2010/11/20镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
看到这种风格,我就想,何苦呢,加个括号会死么??
没办法,考试和面试都要靠这些,人脑判断编译器怎么想,唉
btw:其实吧,最主要的原因是,我不会,也懒得折腾
再ps:要是我将来当老板,谁咬写这样的代码,一巴掌先过去招呼~~
加了括号也不会的飘过
【 在 lanphon (上善若水) 的大作中提到: 】
: 看到这种风格,我就想,何苦呢,加个括号会死么??
: 没办法,考试和面试都要靠这些,人脑判断编译器怎么想,唉
: btw:其实吧,最主要的原因是,我不会,也懒得折腾
: ...................
行为未定义
我试着解释一下:
cout是个对象, <<是个运算符。operator<<是个函数。
cout << a << b;
相当于(operator<<(&cout, a))<<b;
原式相当于operator<<(&(operator<<(&cout,a)), b);
为了看着舒服,我们把 operator<< 用 FUNC 换下来:
FUNC(&FUNC(&cout, a), b)
~~~~~~~~~~~~~~ ~~
先对前一个波浪线所示的部分求值,还是先对后一个波浪线所示的部分求值?未定义!
就像printf("%d %d", *p++, *++p)一样。
【 在 gv404 (gvstar) 的大作中提到: 】
: int ch[3]={1,2,3};
: int *p=ch;
: int *q=ch;
: cout<<*p++<<" "<<*++p<<endl;
: cout<<*q++<<" "<<*q++<<endl;
【 在 wildpointer 的大作中提到: 】
: 行为未定义
: 我试着解释一下:
: cout是个对象, <<是个运算符。operator<<是个函数。
: ...................
cout<<*p++<<" "<<*++p<<endl;
cout<<*q++<<" "<<*q++<<endl;
这两行有明显的差别,请赐教
我觉得你就是把全排列都写出来也没人会
【 在 gv404 (gvstar) 的大作中提到: 】
: cout<<*p++<<" "<<*++p<<endl;
: cout<<*q++<<" "<<*q++<<endl;
: 这两行有明显的差别,请赐教
: ...................
这两行都是未定义的。
未定义的意思就是编译器怎么干都行。编译器安排代码输出个hello world也行。
【 在 gv404 (gvstar) 的大作中提到: 】
【 在 wildpointer 的大作中提到: 】
: 行为未定义
: 我试着解释一下:
: cout是个对象, <<是个运算符。operator<<是个函数。
: ...................
cout<<*p++<<" "<<*++p<<endl;
cout<<*q++<<" "<<*q++<<endl;
这两行有明显的差别,请赐教
这个还算是简单的呢, printf打印参数是从右向左压栈。
printf("%d %d\n",*p++,*++p);// p 先加 *p=2, 然后 *p=2 接着p自加 输出 2,2
printf("%d %d\n",*q++,*q++);// q先输出 *q=1 然后 q自加 *q=2 q自加 输出 2,1