Re: [問題] 關於?:條件執行的問題
※ 引述《qazqaz ()》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: c
: 最近程式書剛好讀到 ?: 判斷式的用法
: 自己試試看後發現結果不符,想不出為捨麼><
: 自己的程式碼:
: #include <stdio.h>
: #include <stdlib.h>
: int main(void)
: {
: int i=4;
: (i>3)
: ?
: printf("i>3"),
: printf("a")
: :
: printf("i<=3"),
: printf("b")
: ;
: system("pause");
: return (0);
: }
: 顯示出:
: i>3ab
: 多跑出一個b
: run了一下範例光碟的程式碼沒有這個問題
: 感謝解惑>_<
→ PkmX:因為?:的優先權比,高啊... 11/06 02:15
推 flydragon198:在兩個printf頭尾加上()就正常了,範圍的問題吧 11/06 02:25
→ flydragon198:( printf("i<=3"), printf("b") ) 11/06 02:26
推P大跟f大說的!
[解釋]
Ternary conditional (?:) (或稱conditional operator)
意即(?:)是一個operator, 他的運算元是3個expression(以下簡稱:expr)
形式為:
expr1 ? expr2 : expr3
當expr1為true,就evaluate expr2, 整個expr回傳的是expr2的return值。
當expr1為false,就evaluate expr3, 整個expr回傳的是expr3的return值。
所以這行:
(i > 3) ? printf("i>3"), printf("a") : printf("i<=3"), printf("b");
你的解讀應該是:
(i > 3) ? printf("i>3"), printf("a") : printf("i<=3"), printf("b");
======= ========================== ===========================
expr1 expr2 expr3
但實際上卻會被這樣解讀(注意括號):
((i > 3) ? (printf("i>3"), printf("a")) : printf("i<=3")) , printf("b");
======= ============================ ============== | ===========
expr1 expr2 expr3 | expr4
(comma operator)
所以不管怎麼樣都會印出"b"的原因在此。
[解決方案]
1.適當地加上括號
(i > 3) ? (printf("i>3"), printf("a")) : (printf("i<=3"), printf("b"));
2.換個方式寫應該也可以達成一樣的效果:
printf("\n%s\n", (i > 3) ? "i>3a" : "i<=3b" );
以上是我的理解,希望有幫上忙。
若有錯還請版上各位大大指正:)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.33.201.221
※ 編輯: CHeagleeye 來自: 114.33.201.221 (11/06 04:50)
推
11/06 06:32, , 1F
11/06 06:32, 1F
推
11/06 09:53, , 2F
11/06 09:53, 2F
推
11/06 10:00, , 3F
11/06 10:00, 3F
→
11/06 11:22, , 4F
11/06 11:22, 4F
討論串 (同標題文章)