Discussion:
有關for 迴圈
(时间太久无法回复)
._.
2006-10-25 17:26:51 UTC
Permalink
單看 a++ <= 3 跟 ++a <= 3 這兩個部份.
如果你手邊有書的話, 理論上會說 ++ 在前或在後的差異.
如果沒說或叫你不要用, 那是因為不希望你冒不必要的風險產生非預期的結果

a++ <= 3 可以看成是 ++a <= 3 可以看成是
=================== ===================
a <= 3; a = a + 1;
a = a + 1; a <= 3;
=================== ===================

上面的問題看起來很容易懂, 為什麼會說"冒不必要的風險產生非預期的結果"?

我只能說, 請問 a = (a++) + (a--); 何解?
請在腦袋中想一次, Code 跑跑看.
然後是否產生了預期的結果?
保證換了編譯器或 JVM 以後結果依舊嗎?

另外for的initial寫在( )內和先宣告的差別
對我比較重要的部份是在於那個變數會活多久, 有效範圍多大.

至於會有差異, 那就是某個地方有更動到數值, 但是你沒有預期到吧.

※ 引述《***@bbs.ee.ncku.edu.tw (kimi)》之銘言:
: int a=1,b=10;
: for(;a++<=3;b++)
: {System.out.println("a="+a+"b="+b);}
: 其輸出為
: a=2b=10
: a=3b=11
: a=4b=12
: 請問為何會有a=4這種情況呢?
: 另一種..
: int a=1,b=10;
: for(;++a<=3;b++)
: {System.out.println("a="+a+"b="+b);}
: 其輸出為
: a=2b=10
: a=3b=11
: 此差異之成因...?
: 另..for的initial寫在( )內和先宣告的差別是..?
: 小弟用for寫nested loop時..initial寫的位置不同.其輸出結果也差異甚大.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.148.49
好累想睡覺
2006-10-25 17:44:11 UTC
Permalink
※ 引述《***@bbs.ee.ncku.edu.tw (kimi)》之銘言:
: int a=1,b=10;
: for(;a++<=3;b++)
: {System.out.println("a="+a+"b="+b);}
: 其輸出為
: a=2b=10
: a=3b=11
: a=4b=12
: 請問為何會有a=4這種情況呢?
: 另一種..
: int a=1,b=10;
: for(;++a<=3;b++)
: {System.out.println("a="+a+"b="+b);}
: 其輸出為
: a=2b=10
: a=3b=11
: 此差異之成因...?
應該是因為 a++ 和 ++a 所執行的動作不同而造成的

用一個簡單的例子就可以看出來

int a=1 ;
System.out.println("a++ : " + (a++) ) ;
System.out.println("a : " + a) ;

a = 1 ;
System.out.println("++a : " + (++a) ) ;
System.out.println("a : " + a) ;

其結果為 :
a++ : 1
a : 2
++a : 2
a : 2

從例子中可以看出 a++ 是把 a 的值先傳出 , 再做運算

也因此第一個show出 a++ 的 value 是原本的值 1

第二次show的時候就是運算後的 2 了

而 ++a 先是做運算再傳值

因此第三次show出的 ++a 就是運算後的結果

和第四次show出的值是相同的

也因為這樣結果影響到 for 最後一次的判斷

用 a++ 的for迴圈 show出 a=3b=11 時

做完b++的動作後

下一個判斷式 (a++)<=3 a++部分會回傳 3 , 因此條件為真

但是往下做到 System.out.println("a="+a+"b="+b); 的時候

a 的值卻會是傳出 4

相同的情況用 ++a

在判斷式 (++a)<=3 ++a 部分會回傳 4 , 因此條件為假

就不會往下做了....

純粹個人的見解 有錯誤還請多指教

: 另..for的initial寫在( )內和先宣告的差別是..?
: 小弟用for寫nested loop時..initial寫的位置不同.其輸出結果也差異甚大.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.118.52
好累想睡覺
2006-10-25 18:29:47 UTC
Permalink
※ 引述《ogamenewbie (._.)》之銘言:
: 單看 a++ <= 3 跟 ++a <= 3 這兩個部份.
: 如果你手邊有書的話, 理論上會說 ++ 在前或在後的差異.
: 如果沒說或叫你不要用, 那是因為不希望你冒不必要的風險產生非預期的結果
: a++ <= 3 可以看成是 ++a <= 3 可以看成是
: =================== ===================
: a <= 3; a = a + 1;
: a = a + 1; a <= 3;
: =================== ===================
: 上面的問題看起來很容易懂, 為什麼會說"冒不必要的風險產生非預期的結果"?
: 我只能說, 請問 a = (a++) + (a--); 何解?
: 請在腦袋中想一次, Code 跑跑看.
: 然後是否產生了預期的結果?
: 保證換了編譯器或 JVM 以後結果依舊嗎?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
不好意思.......可以請問一下這句話的原因嗎??
假如對 a++ 而言的作法是先從記憶體取出數值後傳出後再作運算
在JVM的實作上會有什麼樣的差異嗎??

因為我目前試過window上 JDK 1.5 和 linux上的JVM (版本名我不是很清楚)
但是做出來的數值都是一樣的
: 另外for的initial寫在( )內和先宣告的差別
: 對我比較重要的部份是在於那個變數會活多久, 有效範圍多大.
: 至於會有差異, 那就是某個地方有更動到數值, 但是你沒有預期到吧.
: ※ 引述《***@bbs.ee.ncku.edu.tw (kimi)》之銘言:
: : int a=1,b=10;
: : for(;a++<=3;b++)
: : {System.out.println("a="+a+"b="+b);}
: : 其輸出為
: : a=2b=10
: : a=3b=11
: : a=4b=12
: : 請問為何會有a=4這種情況呢?
: : 另一種..
: : int a=1,b=10;
: : for(;++a<=3;b++)
: : {System.out.println("a="+a+"b="+b);}
: : 其輸出為
: : a=2b=10
: : a=3b=11
: : 此差異之成因...?
: : 另..for的initial寫在( )內和先宣告的差別是..?
: : 小弟用for寫nested loop時..initial寫的位置不同.其輸出結果也差異甚大.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.101.163
※ 編輯: aeifkz 來自: 163.25.101.163 (10/26 10:29)
._.
2006-10-25 19:28:41 UTC
Permalink
※ 引述《aeifkz (好累想睡覺)》之銘言:
: ※ 引述《ogamenewbie (._.)》之銘言:
: : 保證換了編譯器或 JVM 以後結果依舊嗎?
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: 不好意思.......可以請問一下這句話的原因嗎??
: 假如對 a++ 而言的作法是先從記憶體取出數值後傳出後再作運算
: 在JVM的實作上會有什麼樣的差異嗎??

我印象中有人提過 JLS 裡面沒有規範 = 跟 ++ 誰先誰後.
沒有規範的東西, 實作上會有什麼樣的差異, 那就因實做而異, 不是嗎?

: 因為我目前試過window上 JDK 1.5 和 linux上的JVM (版本名我不是很清楚)
: 但是做出來的數值都是一樣的

如果你拿了 sun 的 windows 版跟 linux 版的 JVM 跑出來一樣的結果,

其實我也不是很驚訝. ..╮(﹋﹏﹌)╭..

如果跑出來不一樣, 那我真的會嚇一跳.

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.148.49

继续阅读narkive:
Loading...