appletree 发表于 2010-3-16 22:52

C++最基础问题求助

刚接触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

编译器的问题

所以最好不要这样写

tonyunreal 发表于 2010-3-16 23:04

cout << i <<\";\"<<i++ <<\";\"<<i+2<<endl;

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

fmeric 发表于 2010-3-16 23:14

正义魔 发表于 2010-3-16 23:51

本帖最后由 正义魔 于 2010-3-18 00:58 编辑

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

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

ps.一不小心 \\ 被识别成 bbcode 了,刚发现……

jxyy99 发表于 2010-3-16 23:54

cout << i <<\";\"<<i++ <<\";\"<<i+2<<endl;

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

appletree 发表于 2010-3-17 08:30

编译器的问题

所以最好不要这样写
蕾丝蕾丝 发表于 2010-3-16 22:59 http://bbs.saraba1st.com/2b/images/common/back.gif
明白了,谢AVC

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

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

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

总的来说,这种结果不是编译器的处理问题,而是你没写明自己程序的优先顺序
正义魔 发表于 2010-3-16 23:51 http://bbs.saraba1st.com/2b/images/common/back.gif
请教如何写明程序优先顺序,可以使编译执行顺序从左到右呢?麻烦举个例子吧,谢谢

eph 发表于 2010-3-17 09:09

……加括号

Aerith 发表于 2010-3-17 09:13

这种写法都是考试时给你绕脑筋用的。
真的做工程不能这样写,代码可读性太差了。

HyperIris 发表于 2010-3-17 10:02

voluspa 发表于 2010-3-17 10:20

chillicez 发表于 2010-3-17 10:47

没有那个c++考试会涉及这种编译器相关的问题
所以不要纠结于结果是什么,也绝对别写这种代码

dreamz 发表于 2010-3-17 10:58

这种代码最恶心了...

haryseldon 发表于 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 http://bbs.saraba1st.com/2b/images/common/back.gif

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

重申一下,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);

这就是我提到的人为指定运算顺序
页: [1]
查看完整版本: C++最基础问题求助