为了账号安全,请及时绑定邮箱和手机立即绑定

以下是关于数据结构队列的问题,为什么两次输出结果是不一样的?

以下是关于数据结构队列的问题,为什么两次输出结果是不一样的?

POPMUISE 2022-06-11 14:10:37
Queue q=init_queue();insert_queue(q,1);insert_queue(q,2);/*int data1=get_queue(q);int data2=get_queue(q);cout<<"队列出对的元素依次是:"<<data1<<endl<<data2<<endl;*/这样写,我的输出是1,2cout<<"队列出对的元素依次是:"<<get_queue(q)<<endl<<get_queue(q)<<endl;//这样写,我的输出是2,1求高人解答。
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

这个问题和队列没有关系,主要是编译器或者说cout的问题
1.cout参数入栈的顺序是从右到左...例如...cout<<a <<b <<c;在栈中的位置如下:c-b-a.. <-(栈指针);但是输出是从栈指针的位置开始的,意思即这时的输出顺序仍然是abc....否则有违常理...
2.如果参数是有待计算的函数,例如...cout <<f(a) <<f(b) <<f(c) <<endl;这时我认为cout会先把函数放进栈中然后再计算..意思是这时栈顺序是f(c)-f(b)-f(a).. <-..但是这时候计算的顺序却是f(c)最先,f(b)次之,f(a)最后...
所以,当你的参数有表达式时,他是先从右到左计算的。
比如下面的程序,他计算的顺序和存到缓存器的值可能并不是你直观看到的,你可能认为输出应该是
1
2
410
其实不是这样。这里面还有运算符的结合律以及编译器的语义分析等,学过编译原理应该很好理解,所以出现我下面code中这样可能编译器与自己有歧义的表达方式就出错了,不能这样写
#include<iostream>
using namespace std;
int main() {
int ret,i=0;
cout<<++i<<endl<<++i<<endl;
ret = (i++)*5 + (++i)*100 ;
cout<<ret<<endl;
return ret;
}


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号