Board logo

標題: C語言OPERATOR問題 [打印本頁]

作者: 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++,那麼,不是先運算了++y再運算y++嗎? ...
haloPaul 發表於 2018-11-7 15:45



    點解++y在優先權是優先過y++?
作者: masseffect    時間: 2018-11-7 18:07

首先感謝您的答覆。但是有一個地方不明白,++y在優先權是優先過y++,那麼,不是先運算了++y再運算y++嗎? ...
haloPaul 發表於 2018-11-7 15:45

人地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

千其唔好寫咁嘅code
就算你而家明白左點解
過幾個月後可能會唔記得, 或者你d teammates會唔明
到時又要查re ...
wfshop 發表於 2018-11-7 19:19


如果咁都睇唔明係咪應該砍掉重練?
作者: 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 編輯
如果咁都睇唔明係咪應該砍掉重練?
7h1r733n 發表於 2018-11-7 19:25



又唔係咁講
連用兩次++同--真係比一般新手會混淆的問題複雜好多
其實#8話undefined behaviour先至係
就算唔係undefined,都有非比尋常的細節要諗清楚
例如Java, Javascript都有++, --
但點解釋以下點解有唔同?
  1. $ cat main.c
  2. #include <stdio.h>
  3. int main() {
  4.     int x = 1;
  5.     printf("%d\n", x++ * x++);
  6.     x = 1;
  7.     printf("%d\n", x++ * ++x);
  8.     x = 1;
  9.     printf("%d\n", ++x * x++);
  10.     x = 1;
  11.     printf("%d\n", ++x * ++x);
  12.     return 0;
  13. }
  14. $ make main && ./main
  15. 2
  16. 3
  17. 6
  18. 9

  19. $ cat Main.java
  20. class Main {
  21.     public static void main(String[] argv) {
  22.         int x = 1;
  23.         System.out.println(x++ * x++);
  24.         x = 1;
  25.         System.out.println(x++ * ++x);
  26.         x = 1;
  27.         System.out.println(++x * x++);
  28.         x = 1;
  29.         System.out.println(++x * ++x);
  30.     }
  31. }
  32. $ javac Main.java && java Main
  33. 2
  34. 3
  35. 4
  36. 6

  37. $ cat main.js
  38. var x = 1;
  39. console.log(x++ * x++);
  40. x = 1;
  41. console.log(x++ * ++x);
  42. x = 1;
  43. console.log(++x * x++);
  44. x = 1;
  45. console.log(++x * ++x);
  46. $ node main.js
  47. 2
  48. 3
  49. 4
  50. 6
複製代碼

作者: 7h1r733n    時間: 2018-11-7 23:54

本帖最後由 7h1r733n 於 2018-11-7 23:55 編輯
又唔係咁講
連用兩次++同--真係比一般新手會混淆的問題複雜好多
其實#8話undefined behaviour先至係
就 ...
EITCo 發表於 2018-11-7 22:39


其實呢個真係睇compiler.... C個example Windows行果陣結果係可以唔一樣... 左右順序問題..





歡迎光臨 電腦領域 HKEPC Hardware (https://h2.hkepc.com/forum/) Powered by Discuz! 7.2