作者: haloPaul 時間: 2018-11-7 14:39 標題: C語言OPERATOR問題
本帖最後由 haloPaul 於 2018-11-7 15:02 編輯
#include <stdio.h>
int main() {
char ch = 'B';
int x = 4, y = 3, z;
float k = 1.5;
z = y++ - ++y;
printf("%d", z);
return 0;
}
我用C語言編譯器,Z答案等於-2,一直想不到為什麼答案會是-2?
請C語言高手指點一二,謝謝!
作者: 7h1r733n 時間: 2018-11-7 14:55
#include
int main() {
char ch = 'B';
int x = 4, y = 3, z;
float k = 1.5;
z = y++ - ++y;
pri ...
haloPaul 發表於 2018-11-7 14:39
https://en.cppreference.com/w/c/language/operator_precedence
作者: haloPaul 時間: 2018-11-7 15:06
我知道OPERATOR有優先性,其實我看完都不明白為什麼答案會是-2
作者: IanW 時間: 2018-11-7 15:28
"z = y++ - ++y;" -> "z = a - b"
y++ 在這裡時, 仲係 y = 3, 即係 a = 3, 行過左佢, 就係 y = 4.
到 ++y 時, y 就係 5, 所以 b = 5.
z = 3 - 5 = -2.
作者: haloPaul 時間: 2018-11-7 15:45
"z = y++ - ++y;" -> "z = a - b"
y++ 在這裡時, 仲係 y = 3, 即係 a = 3, 行過左佢, 就係 y = 4.
到 ++y ...
IanW 發表於 2018-11-7 15:28
首先感謝您的答覆。但是有一個地方不明白,++y在優先權是優先過y++,那麼,不是先運算了++y再運算y++嗎?
作者: IanW 時間: 2018-11-7 15:58
點解++y在優先權是優先過y++?
作者: masseffect 時間: 2018-11-7 18:07
人地post 條link都講到名y++係優先過++y喎
作者: smoke_cheese 時間: 2018-11-7 18:50
本帖最後由 smoke_cheese 於 2018-11-7 18:51 編輯
Undefined behaviour (value (of y) modified twice within the expression, i.e. between sequence points)
http://c-faq.com/expr/seqpoints.html
作者: wfshop 時間: 2018-11-7 19:19
千其唔好寫咁嘅code
就算你而家明白左點解
過幾個月後可能會唔記得, 或者你d teammates會唔明
到時又要查reference, 又要花時間test, 又要傷腦筋
programming唔係要寫最精簡嘅code
唔係要最叼轉, 耍小聰明
而係要最清淅, 最易maintain
作者: 7h1r733n 時間: 2018-11-7 19:25
如果咁都睇唔明係咪應該砍掉重練?

作者: 7h1r733n 時間: 2018-11-7 19:38
y++ 即係先return y再做加... 所以y++=3 然後- y既值+1, 再行++y... 先加再return... 所以++y既值係5... 就係咁啦...
即係z=?-(1+1+?)=-2
作者: EITCo 時間: 2018-11-7 22:39
本帖最後由 EITCo 於 2018-11-7 22:58 編輯
又唔係咁講
連用兩次++同--真係比一般新手會混淆的問題複雜好多
其實#8話undefined behaviour先至係
就算唔係undefined,都有非比尋常的細節要諗清楚
例如Java, Javascript都有++, --
但點解釋以下點解有唔同?
- $ cat main.c
- #include <stdio.h>
- int main() {
- int x = 1;
- printf("%d\n", x++ * x++);
- x = 1;
- printf("%d\n", x++ * ++x);
- x = 1;
- printf("%d\n", ++x * x++);
- x = 1;
- printf("%d\n", ++x * ++x);
- return 0;
- }
- $ make main && ./main
- 2
- 3
- 6
- 9
- $ cat Main.java
- class Main {
- public static void main(String[] argv) {
- int x = 1;
- System.out.println(x++ * x++);
- x = 1;
- System.out.println(x++ * ++x);
- x = 1;
- System.out.println(++x * x++);
- x = 1;
- System.out.println(++x * ++x);
- }
- }
- $ javac Main.java && java Main
- 2
- 3
- 4
- 6
- $ cat main.js
- var x = 1;
- console.log(x++ * x++);
- x = 1;
- console.log(x++ * ++x);
- x = 1;
- console.log(++x * x++);
- x = 1;
- console.log(++x * ++x);
- $ node main.js
- 2
- 3
- 4
- 6
作者: 7h1r733n 時間: 2018-11-7 23:54
本帖最後由 7h1r733n 於 2018-11-7 23:55 編輯
其實呢個真係睇compiler.... C個example Windows行果陣結果係可以唔一樣... 左右順序問題..

