討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 政府補助!學嵌入式+物聯網 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
三元運算子放在if會有bug?
更改我的閱讀文章字型大小
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/2 下午 10:32:55
int a=0,b=1;
   
   int t;
   if(t=3+3==3+3?a:b)
   printf("%d\n",t);


編譯後,沒有東西輸出

t得到1,應該輸出a值阿



反之假如是這樣
 int a=1,b=0;
   
   int t;
   if(t=4+3==3+3?a:b)
   printf("%d\n",t);

t得到0,應該輸出b值阿....結果也沒


但假如把if拿掉
變成

   int a=0,b=1;
   
   int t;
   t=3+3==3+3?a:b;
   printf("%d\n",t);

就輸出a值了



反之
 int a=1,b=0;
   
   int t;
   t=4+3==3+3?a:b;
   printf("%d\n",t);

也就有輸出b值




可以看出三元運算子放在if括號理,
if裡的printf要輸出0好像不太可能..

因為連
   int a=0,b=1;
   int t;
   if(t=3+3==3+3?a:b)
   printf("0\n");

這樣0都輸出不出來

講這麼多,這是c語言的bug,
還是我使用的編譯器的bug?

我的編譯器是GCC
   


作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 上午 11:24:21
please post their output results
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 01:34:30
int a=0,b=1;
   
   int t;
   if(t=3+3==3+3?a:b)
   printf("%d\n",t);



the damn output result:
請按任意鍵繼續 . . .


------------------------
 int a=1,b=0;
   
   int t;
   if(t=4+3==3+3?a:b)
   printf("%d\n",t);


the damn output result:
請按任意鍵繼續 . . .



------------------------
int a=0,b=1;
   
   int t;
   t=3+3==3+3?a:b;
   printf("%d\n",t);


the damn output result:
0
請按任意鍵繼續 . . .


---------------------
 int a=1,b=0;
   
   int t;
   t=4+3==3+3?a:b;
   printf("%d\n",t);

the damn output result:
0
請按任意鍵繼續 . . .

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 03:54:48

>please post their output results

OK 好了
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 06:14:17
int a=0,b=1;
   if(t=3+3==3+3?a:b)
t是0 false 當然沒輸出 //是0不是1 你自己想想為什麼

 int a=1,b=0;
   if(t=4+3==3+3?a:b)
t是0 false 當然沒輸出

有啥好奇怪的?


作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 06:25:15
寫錯

(t=3+3==3+3?a:b)是0 false 沒輸出
作者 : kib72377(史努比) Visual Basic卓越專家Assembly優秀好手Access頂尖高手貼文超過1000則
[ 貼文 1455 | 人氣 1891 | 評價 8600 | 評價/貼文 5.91 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 07:41:30
噗...
加一段 else 敘述就會有輸出了....
作者 : kib72377(史努比) Visual Basic卓越專家Assembly優秀好手Access頂尖高手貼文超過1000則
[ 貼文 1455 | 人氣 1891 | 評價 8600 | 評價/貼文 5.91 | 送出評價 31 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 07:42:05
噗...
加一段 else 敘述就會有輸出了....
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 07:53:12

>int a=0,b=1;
> if(t=3+3==3+3?a:b)
>t是0 false 當然沒輸出 //是0不是1 你自己想想為什麼
>
> int a=1,b=0;
> if(t=4+3==3+3?a:b)
>t是0 false 當然沒輸出
>
>有啥好奇怪的?
>

ㄏㄏ抱歉,是我的錯


所以這段 if(t=3+3==3+3?a:b)
意思是這樣
if(t=3+3==(3+3?a:b))

這樣對嗎?





作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 08:02:04

>
>>int a=0,b=1;
>> if(t=3+3==3+3?a:b)
>>t是0 false 當然沒輸出 //是0不是1 你自己想想為什麼
>>
>> int a=1,b=0;
>> if(t=4+3==3+3?a:b)
>>t是0 false 當然沒輸出
>>
>>有啥好奇怪的?
>>
>
>ㄏㄏ抱歉,是我的錯
>
>
>所以這段 if(t=3+3==3+3?a:b)
>意思是這樣
>if(t=3+3==(3+3?a:b))
>
>這樣對嗎?
>
>
>
等等 剛剛測試又好像不是這樣....
暈了@@
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 09:07:02

>int a=0,b=1;
> if(t=3+3==3+3?a:b)
>t是0 false 當然沒輸出 //是0不是1 你自己想想為什麼
>
> int a=1,b=0;
> if(t=4+3==3+3?a:b)
>t是0 false 當然沒輸出
>
>有啥好奇怪的?
>
>
>

抱歉
我真的不知道,能否提供一些線索....

例如哪個先比較之類的
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 09:56:59
程式不要這樣玩,請看此文http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/3 下午 10:17:31
>我真的不知道,能否提供一些線索....
>例如哪個先比較之類的

http://en.cppreference.com/w/c/language/operator_precedence

作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/4 上午 10:00:07
int a=0,b=1;
int a=1,b=0;

一個是true得a=0 false
一個是true得a=1 true
你再想想吧
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/4 上午 11:21:45

>int a=0,b=1;
>
> int t;
> if(t=3+3==3+3?a:b)
> printf("%d\n",t);
>
>
>編譯後,沒有東西輸出
>
>t得到1,應該輸出a值阿

為什麼樓主認為 t 會得到 1?


>反之假如是這樣
> int a=1,b=0;
>
> int t;
> if(t=4+3==3+3?a:b)
> printf("%d\n",t);
>
>t得到0,應該輸出b值阿....結果也沒

t 會設為 0 沒有錯. 但請問樓主以下的判斷式會執行哪個部份:
  if (t = 0)
  {
    /* A 部份 */
  }
  else
  {
    /* B 部份 */
  }

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/4 下午 01:53:45

>
>>int a=0,b=1;
>>
>> int t;
>> if(t=3+3==3+3?a:b)
>> printf('%d
',t);
>>
>>
>>編譯後,沒有東西輸出
>>
>>t得到1,應該輸出a值阿
>
>為什麼樓主認為 t 會得到 1?

因為3+3 == 3+3是true
所以是1,1就給t
我是這麼想的

>
>
>>反之假如是這樣
>> int a=1,b=0;
>>
>> int t;
>> if(t=4+3==3+3?a:b)
>> printf('%d
',t);
>>
>>t得到0,應該輸出b值阿....結果也沒
>
>t 會設為 0 沒有錯. 但請問樓主以下的判斷式會執行哪個部份:
>  if (t = 0)
>  {
>    /* A 部份 */
>  }
>  else
>  {
>    /* B 部份 */
>  }
>
應該是A部分吧

if(t=0)
好像沒什麼特別意思,不是單純在條件式裡設定初值嗎

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/4 下午 02:50:59

>
>>int a=0,b=1;
>>
>> int t;
>> if(t=3+3==3+3?a:b)
>> printf('%d
',t);
>>
>>
>>編譯後,沒有東西輸出
>>
>>t得到1,應該輸出a值阿
>
>為什麼樓主認為 t 會得到 1?
>

抱歉,我知道了
3+3 == 3+3 是1
然後因為是1 所以把a給t
所以t是0,這樣對嗎?



>
>>反之假如是這樣
>> int a=1,b=0;
>>
>> int t;
>> if(t=4+3==3+3?a:b)
>> printf('%d
',t);
>>
>>t得到0,應該輸出b值阿....結果也沒
>
>t 會設為 0 沒有錯. 但請問樓主以下的判斷式會執行哪個部份:
>  if (t = 0)
>  {
>    /* A 部份 */
>  }
>  else
>  {
>    /* B 部份 */
>  }
>

我用一個範例測試

int t;
  
  if(t =0 )
  {
     printf("Good\n");
  }
  else
{
    printf("sad \n");
  }
   

結果是輸出sad

所以請問條件式或結果是0
放在if小括號
  就不會執行if裡的敘述是嗎?

 
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kotty123註記此篇回應為最佳解答 2015/8/4 下午 03:05:10
>然後因為是1 所以把a給t
>所以t是0,這樣對嗎?




>if(t =0 )

等同 if(t )
if(0)
if(false)
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/4 下午 03:30:45
>>然後因為是1 所以把a給t
>>所以t是0,這樣對嗎?
>
>對
>
>
>>if(t =0 )
>
>等同 if(t )
>if(0)
>if(false)


ok我知道了

但我想再問一個問題
請問你們遇到很多加減乘除運算式 跟 條件運算式的運算

會去翻書看每個運算子的編譯順序

還是都記在腦裡了?



作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kotty123註記此篇回應為很有道理 2015/8/4 下午 03:39:50
一個好的程式 是不會那樣寫的
還有善用括號 可以確保順序
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1043 | 人氣 3227 | 評價 1270 | 評價/貼文 1.22 | 送出評價 28 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人kotty123註記此篇回應為很有道理 2015/8/4 下午 03:44:37

>
>但我想再問一個問題
>請問你們遇到很多加減乘除運算式 跟 條件運算式的運算
>
>會去翻書看每個運算子的編譯順序
>
>還是都記在腦裡了?
>

1. 善用括號 ()
2. 盡量分多段計算,不要混在一起
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/4 下午 08:00:33
>>t 會設為 0 沒有錯. 但請問樓主以下的判斷式會執行哪個部份:
>>  if (t = 0)
>>  {
>>    /* A 部份 */
>>  }
>>  else
>>  {
>>    /* B 部份 */
>>  }
>>
>應該是A部分吧
>
>if(t=0)
>好像沒什麼特別意思,不是單純在條件式裡設定初值嗎

if 式子裡括號可以是任何式子, 包括指標. 關鍵在於 () 內的運算結果, if 式子只考慮運算的結果是不是 0. 只要不是 0 就進入 if 式子的主體, 也就是上面的 A 部份; 如果是 0 就進入 else 的主體, 也就是上面的 B 部份.

設值的式子也是運算式, 其結果就是 '=' 左邊變數得到的值.
  if (t = 0)
等同於:
  t = 0;
  if (t)
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.203125