作者gn00618777 (非常念舊)
看板C_and_CPP
標題[問題] 自動轉型別的問題
時間Sun Aug 19 10:36:17 2018
網路上有一個考題
unisgned int a = 6;
int b = -20;
(a+b)?puts(">6"):puts("<6");
Ans: >6
主要是考你 b 會自動轉成 unsigned int
-------------------------------------------------------------------------
我覺得怪怪的。
(-1)?puts(">6"):puts("<6") -->其實也會跑 > 6
(0)?puts(">6"):puts("<6") -->這樣才會跑 < 6
(1)?puts(">6"):puts("<6") -->會跑 >6
總結: 只有在非0時,才會是 true。跟if 和 while 一樣
這其實看不出來是考你自動轉型別。
我再寫一個
unisgned int a = 6;
int b = -20;
printf("%u\n", a+b); //出現一個很大的未知數字
printf("%d\n", a+b); //-14
這並沒有自動轉型別阿!?
我是不是誤會了甚麼?
謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.68.215.61
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1534646181.A.EC7.html
1F:推 jerryh001: 有轉 -20變uint就是很大的數字沒錯 08/19 10:41
2F:→ Lipraxde: 我推薦使用typeof看型別 08/19 11:38
3F:→ xam: 現在compiler會噴warning, 然後設定把warn當error,要你別醬 08/19 12:09
4F:推 sarafciel: 非零的時候才會是false的話 你肯定是誤會了XD 08/19 14:20
※ 編輯: gn00618777 (219.68.215.61), 08/19/2018 15:48:24
※ 編輯: gn00618777 (219.68.215.61), 08/19/2018 15:48:33
5F:→ gn00618777: 抱歉 我手誤 應該是只要非0 都是 true 08/19 15:49
6F:推 leo850319: 第一個要考轉型別的話 應該是要寫 ((a+b) > 6) ? put 08/19 16:15
7F:→ leo850319: s(">6") ... ?前面是一個布林運算式 08/19 16:15
8F:→ leo850319: 第二個的話 printf它會根據你給個%d %u來決定變數輸出 08/19 16:17
9F:→ leo850319: 的時候的型別是什麼 你給%d 它就把存在那個變數的記 08/19 16:17
10F:→ leo850319: 憶體值當作int 08/19 16:17
11F:推 leo850319: 第一個的考法也有直接比較 (a > b )這樣的 08/19 16:25