老實說,我一點都不懂這些。我最不喜歡這些不會用到的東西。以前上課上到這種東西我都直接忽略 XD
但我剛搜了一下,大概有理解,以下是我的淺見,有誤等大神來幫解。
簡單來說這邊你的畫面提到兩個不同的東西:
- Call by Value Result
- Call by Name
至於 Print 出 87 的結果,應該是 Call by Name 才有可能會出現的結果。
Call by Value Result 的說明,應該僅止於上面的文字說明。
下面那一段程式碼,應該是完全分割的另一部分,在說 Call by Name。
Then, 那麼既然你問的是 87 怎麼來,那麼我就先來說說 by Name 我的理解。
# Call by Name
首先我們直接把這套 pseudo code 改成合理的 C 來看看
| #include <stdio.h> #define z x + y void square(int x, int y/*, int z*/) { // 請假設這個 z 是實際有傳的值 x = 10; y = 7; int squared = z * z; printf("Squared: %i\n", squared); // Squared: 87 } int main() { int x = 10, y = 20; square(x, y/*, x + y*/); printf("After: %i, %i\n", x, y); // After: 10, 20 return 0; } |
簡單來說以上就是被替換成了這樣
| #include <stdio.h> void square(int x, int y) { x = 10; y = 7; int squared = x + y * x + y; printf("Squared: %i\n", squared); } int main() { int x = 10, y = 20; square(x, y); printf("After: %i, %i\n", x, y); return 0; } |
那麼 x + y * x + y = x + (y * x) + y = 10 + (7 * 10) + 7 = 87
所以說可以看出 call by name 就是把 "name" (a.k.a raw content) 直接去替換掉使用的地方。
References:
# Call by Value Result
至於 call by Value Result,print 出來的應該就不會是 87 而是 900 了,我猜的。
詳細就看 Reference 吧,原本想寫個模擬,但情境完全不同,根本不會遇到問題,感覺就不用了。
References:
希望這樣有回答到你。
然而這在實際應用都不會出現。
實際應用,簡單就可以說這世界會出現的就是 Call by Reference (傳址) 和 Call by Value (傳值)。
比較複雜的像是 JavaScript 中的參數傳遞,但其實也可以歸類成這樣。
JavaScript 裡面 基本上可以想成是傳值,但是傳的值裡面參照的東西(地址)並不會變。
恩... 不說了好像離題了。
總之就這樣,歡迎其他大神指教一下,畢竟我也只是剛搜來的。