Re: [問題] i值結果
※ 引述《RJking (RJ-king)》之銘言:
: ※ 引述《walks (蹦蹦跳跳)》之銘言:
: : 1.: i = 1 ;
: : 2.: ++i+=i++;
: 老實說這個答案好像不同compiler會不一樣,因為對語句解釋的不同
: 大概講一下RJ牌人腦compiler的答案跟流程
: 1.: i = 1 ; //將i指定為1
: 2.: ++i+=i++ ; //先做++i(i變成2),然後做i+=i(i指定成i+i,i變成4)
: //然後做i++(i變成5)
: 所以i的值最後是5
: 還有就是VS2005跟VS2008跟DEV C++會直接跟你說"++i+=i++"這行語法錯誤
: 如果題目直接註明一定有答案或是你怕老師認為一定會有答案,你可以考慮用我的答案
: 我對第二行的解釋只是單純基於運算子優先順序而已...
在 C 中這是違法的,而在 C++ 中這是合法的。
所以以上運算式用 g++ 是可以 compile 過的,而 gcc 不行。
簡單來說,
在 C++ 中, ++i 會將 i 值遞增後,回傳 i 這個 [變數]
而在 C, ++i 在 i 遞增後回傳的是 i 這個變數的 [值]
而無論在 C/C++
i++ 回傳的都是都是 i 的 [值]。
但放在等號左邊的必須為一 lvalue,也就是可被解析出該物件的位址
因此,i 這個 [變數] 可以當作 lvalue,因為 i 是一個有位址的物件
但 i 的 [值] 卻不行,因為它並非是一個物件
因此,在 C++ 中,
++i = i++; 會過
i++ = i++; 不會過
在 C 中,
上面兩式均不會通過編譯。
我們也可經由上面知道,
*(&i) = 0; 這樣的指定式在 C/C++ 中均不會通過編譯,
因為 *(&i) 回傳的是 i 的 [值] 而不是 i 這個 [變數物件]。
: 這可以算是Undefined behavior吧...
: http://en.wikipedia.org/wiki/Undefined_behavior
是的,因為 i 的值在 sequence points 中被更改了兩次,
不過我想老師應該只是要考運算子優先序的觀念,答案應該就是 5 吧。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.2.239
→
04/01 11:39, , 1F
04/01 11:39, 1F
→
04/01 11:40, , 2F
04/01 11:40, 2F
推
04/01 12:30, , 3F
04/01 12:30, 3F
→
04/01 12:30, , 4F
04/01 12:30, 4F
→
04/01 12:31, , 5F
04/01 12:31, 5F
→
04/01 12:31, , 6F
04/01 12:31, 6F
推
04/01 13:17, , 7F
04/01 13:17, 7F
→
04/01 13:17, , 8F
04/01 13:17, 8F
→
04/01 13:18, , 9F
04/01 13:18, 9F
→
04/01 13:23, , 10F
04/01 13:23, 10F
→
04/01 13:23, , 11F
04/01 13:23, 11F
→
04/01 19:43, , 12F
04/01 19:43, 12F
推
04/01 19:58, , 13F
04/01 19:58, 13F
→
04/01 19:59, , 14F
04/01 19:59, 14F
討論串 (同標題文章)