作者cfbbq (CF)
看板C_and_CPP
标题[问题] 新手十诫疑问
时间Wed Feb 4 18:03:37 2009
底下转至新手十诫
------------
你也不可以在一个运算式(expression)中,对一个基本型态的变数修改其值,
而且还在同一个式子的其他地方为了其他目的而存取该变数的值。(其他目的,
是指不是为了计算这个变数的新值的目的)。否则,将导致未定义的行为。
错误例子:
int arr[5];
int i = 0;
arr[i] = i++;
正确例子:
int arr[5];
int i = 0;
arr[i] = i;
i++;
[C++程式]
错误例子:
int i = 10;
cout << i << "==" << i++;
正确例子:
int i = 10;
cout << i << "==";
cout << i++;
------------
我不懂那两个错误例子错在哪里,我的例子:
int i=10;
std::cout<<i<<' '<<i++<<' '<<i<<' '<<++i<<' '<<i;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.224.150.217
1F:→ james732:应该就是不要在同一行里面对一个变数又改又读的意思...? 02/04 18:10
2F:→ cfbbq:我知道,但是我觉得没错阿,只要不要<<i++ + i;这种就好吧? 02/04 18:13
3F:→ cfbbq:<<i++<<i;这不是一个运算是阿! 02/04 18:14
4F:推 ledia:<< 也是运算子呀 02/04 18:27
5F:推 LPH66:问题如同前几篇 i++结算的时间不确定 02/04 18:33
6F:→ LPH66:虽然顺序是由左到右 (<<是左结合) 但i++却不确定会何时结算 02/04 18:33
8F:→ cfbbq:我的疑问是:cout<<i++<<i;跟cout<<i++;cout<<i;似乎等於? 02/04 19:45
9F:→ akasan:表面上一样而已cout<<i++;cout<<i;会保证其求值顺序 02/04 20:14
10F:→ akasan:cout<<i++<<i;则是无法确定到底是i先求值还是i++先求值 02/04 20:15
11F:→ cfbbq:<<是左结合,可以保证上面的楼上的i++先求值? 02/04 20:22
12F:推 LPH66:求值归求值 问题在於i什麽时候+1 02/04 21:24
13F:→ LPH66:後面的写法在第一个;时确定i已经加1了 02/04 21:24
14F:→ LPH66:前面的写法则要到那条的;才会确定i已经加1 02/04 21:25
15F:→ LPH66:但这却是在前式後面的 i 求值之後 02/04 21:25
16F:→ LPH66:至於此时的 i加1 和 後面的i求值 这两件事是不确定先後的 02/04 21:26
17F:→ LPH66:(顺带一提, 某些compiler因为方便实作的关系 02/04 21:26
18F:→ LPH66: 左结合的东西会实作成每个operand是反过来求值 02/04 21:27
19F:→ LPH66: 至於是不是一定反过来求则一样是未规定) 02/04 21:27
20F:推 LPH66:噢我忘了 overloaded operator 等於 function call...@_@ 02/04 21:37
21F:→ LPH66:所以下下篇是对的 这里刚好是特例 前面的i++会在後面i前结算 02/04 21:38
22F:推 StubbornLin:结合的顺序不代表赋值(evaluate)的顺序 02/04 21:49
23F:→ akasan:无聊去测一下...cout << i++ << i; GCC跟VC一样是12 02/05 14:56
24F:→ akasan:cout << i << i++;则VC是21 GCC是11 02/05 14:57
25F:→ akasan:实测或许只代表有compiler没照标准走但写CODE还是尽量绕过 02/05 14:59
26F:→ akasan:这种模糊地带 免得哪天有BUG了还不知道怎麽一回事:D 02/05 15:00