找回密码
 立即注册
搜索
查看: 1752|回复: 14

C++最基础问题求助

[复制链接]
     
发表于 2010-3-16 22:52 | 显示全部楼层 |阅读模式
刚接触C++,以前学过一点C.
输出语句cout可连续用
比如
int i=1;
cout << i <<";"<<i++ <<";"<<i+2<<endl;
照理来说应该输出1;1;4吧,可是用VC6运行后输出的是2;1;3
感觉虽然输出是顺序,执行过程却是倒序的,分别各用一个cout输出就正常了,只有连续输出时才这样.
请问是C++就是这样还是VC的问题?
回复

使用道具 举报

发表于 2010-3-16 22:59 | 显示全部楼层
编译器的问题

所以最好不要这样写
回复

使用道具 举报

     
发表于 2010-3-16 23:04 | 显示全部楼层
cout << i <<\";\"<<i++ <<\";\"<<i+2<<endl;

这句不是从右往左执行的么,2;1;3没错啊
回复

使用道具 举报

头像被屏蔽
     
发表于 2010-3-16 23:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2010-3-16 23:51 | 显示全部楼层
本帖最后由 正义魔 于 2010-3-18 00:58 编辑

函数参数是没有先后顺序的(cout 不是操作符),比如 f (v \\[i\\], i ++),你根本无法确定 f 得到的 i 值会是什么。当然 v \\[i\\] = i ++; 这种也会有问题,原因在于你一行表达式中多次调用了 i 而且修改 i 值 (i++)

总的来说,这种结果不是编译器的处理问题,而是你没写明自己程序的优先顺序

ps.一不小心 \\[i\\] 被识别成 bbcode 了,刚发现……
回复

使用道具 举报

     
发表于 2010-3-16 23:54 | 显示全部楼层
cout << i <<\";\"<<i++ <<\";\"<<i+2<<endl;

这个从右往左不就能解释通了么
i=1的话 i+2就是3 i++输出是1再自加。。最后i就是2了。。。
回复

使用道具 举报

     
 楼主| 发表于 2010-3-17 08:30 | 显示全部楼层
编译器的问题

所以最好不要这样写
蕾丝蕾丝 发表于 2010-3-16 22:59

明白了,谢AVC

书上一类似例题答案是从左到右运算的结果,VC里编译结果却是倒着的,所以迷茫了,虽然知道写程序的人是从左到右思考的,看来编书者用的不是VC..

函数参数是没有先后顺序的(cout 不是操作符),比如 f (v , i ++),你根本无法确定 f 得到的 i 值会是什么

当然 v = i ++; 这种也会有问题,原因在于你一行表达式中多次调用了 i 而且修改 i 值 (i++)

总的来说,这种结果不是编译器的处理问题,而是你没写明自己程序的优先顺序
正义魔 发表于 2010-3-16 23:51

请教如何写明程序优先顺序,可以使编译执行顺序从左到右呢?麻烦举个例子吧,谢谢
回复

使用道具 举报

发表于 2010-3-17 09:09 | 显示全部楼层
……加括号
回复

使用道具 举报

     
发表于 2010-3-17 09:13 | 显示全部楼层
这种写法都是考试时给你绕脑筋用的。
真的做工程不能这样写,代码可读性太差了。
回复

使用道具 举报

头像被屏蔽
     
发表于 2010-3-17 10:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
发表于 2010-3-17 10:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2010-3-17 10:47 | 显示全部楼层
没有那个c++考试会涉及这种编译器相关的问题
所以不要纠结于结果是什么,也绝对别写这种代码
回复

使用道具 举报

发表于 2010-3-17 10:58 | 显示全部楼层
这种代码最恶心了...
回复

使用道具 举报

     
发表于 2010-3-17 11:37 | 显示全部楼层
我自己对标准的理解是这样的:
c++标准相当诘屈聱牙的解释了sequence point:sequence point就是程序中的一些点,在相邻的两点之间的表达式求值顺序是没有规定的(函数进入退出,&&, || 逗号和全表达式结束的时候都是sequence point),比如你的那一长串表达式的中间是没有sequence point的,就说中间的求值顺序是由编译器任意指定的。比如cout<<i<<++i,可以先求++i,也可以先求(cout<<i)。然后,还有另外一个更诘屈聱牙的规定是要求这些求值的任何一个顺序都满足一定的规定(基本就说一个变量只能写一次,如果写了,那么读要在写之前这样),如果有任何一个顺序下来不满足这个规定,那么程序就是undefined behavior.你的那个程序就是undefined behavior。
具体一点cout<<i<<++i, 有这么几个操作1:读cout, 2:读i,3:++i, 4:调用第一个<<, 5调用第二个<<
上述规则(<<是个函数调用)以及<<的结合性(左结合)只规定了,1,2在4之前, 3,4在5之前,于是3可以跑到2之前,这样就违反了上面说的要先读后写的规则。
回复

使用道具 举报

发表于 2010-3-18 01:12 | 显示全部楼层
明白了,谢AVC

书上一类似例题答案是从左到右运算的结果,VC里编译结果却是倒着的,所以迷茫了,虽然知道写程序的人是从左到右思考的,看来编书者用的不是VC..


请教如何写明程序优先顺序,可以使编译执行顺序从左到右 ...
appletree 发表于 2010-3-17 08:30


之前写的东西被论坛功能误解了,已改

重申一下,cout 不是操作符……你那个连续的 << 相当于函数嵌套,而函数调用中的运算没有明确的先后顺序

下例还原 cout 的实质:
cout << x << y;
(cout << x) << y;
(operator << (cout, x)) << y;
operator << (operator << (cout, x), y);

即是:

f (f (x), y)

这时候是没有运算顺序的,我认为这样解释应该够明显了,逗号分隔的参数和表达式还是区别很大的吧……

如果你需要指定顺序,那永远都是要分拆开的,左序还是右序本来就是个麻烦,不少书在这点上都很不负责,但上下是有公理的

x = i++;
y = i + 2;
f (x, y);

这就是我提到的人为指定运算顺序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-9-18 23:01 , Processed in 0.152017 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表