精華區beta b97902HW 關於我們 聯絡資訊
既然東西都被講完了,難不成要我發預習用文? 不好吧,大家都還在和使徒奮鬥,不如來補完一下前面的好了。 Dev C 的設定前面講過拿掉智慧型 tab,這裡個人再建議勾選「相對應括號反白」 以及「使用 tab 字元」。 變數的宣告與使用: 變數,顧名思義就是一個可以變更的數。在這裡,我們可以宣告變數, 來儲存我們的資料。如果不把我們所需的資料儲存下來,就會失去它們。 可以把它們看作是儲存用的容器,用來裝我們所需的物品。 這裡先介紹整數變數,以及其宣告方式。 int a, b; 這裡以 int (整數 integer 之簡寫) 來宣告,大家可以跟著我大聲唸。 「在此,我 xxx 宣告兩個整數變數,其一名為 a,另一名為 b。」 如同句子結束要加句號一樣,這裡一個「敘述」結束時,需加上分號。 在這裡,逗號扮演著頓號(、)的意思,用來分隔用的。 依此類推,可以一次宣告一個或多個相同型態的變數。 請將宣告放在 main() 一開始的地方,變數可不能先上車後補票的。 另外也請注意,變數一宣告出來,在還沒使用前,儲存的值並不一定是零唷。 接著教大家怎麼把東西塞給它們。 首先是變數的賦值,也就是直接去指定它們所裝的東西為何。 當然啦,因為是直接指定,所以原先儲存的東西就不見啦。 a = 20; 在此翻譯一下: 「讓 a 的值變成 20。」 在 C 裡面,= 不是「相等」的比較,而是賦值。「相等」是 「==」。 當然啦,我們也可以放一個運算式上去: a = b * 10 + 6; 這樣會先計算右邊的值,再塞給左邊的數。 可是一次只能指派一個變數的值,所以左邊只能放恰一個變數喔。 當然,C 語言很聰明,會自動做先乘除後加減喔。 不過,指派的值是絕對的,如果我要的是相對的變化呢? 比如說,我想讓 a 本身的值多 5 出來。寫這樣行嗎? a + 5; 可是這樣只有拿 a 的值來計算,並沒有對其做任何改變耶! 怎麼辦呢?如果不知道 a 的值,無法直接指派耶!可是 a 是變數, 所以值並不固定啊。幸好我們知道,右邊會先算,才塞給左邊,因此… a = a + 5; 因為會先算右邊、再塞給左邊,所以右邊在計算時,左邊還沒塞, 右邊算出來就會是 a 原先的值,再加上 5。這樣就完美啦,再塞回給 a 時, a 本身的值就多了 5 出來了。神奇吧? 什麼,你說「a 和 a 消掉後,0 = 5 是不成立的」?不不不, 這句話是對的,當且僅當 = 是相等的意思,可惜這裡不是,所以並不會不成立的啦~ 如果覺得每次寫 a = a + 5,好麻煩喔~ 有沒有什麼更快的方法呀?有! a = a + 5 這類的東西,可以寫作 a += 5; 就是「a 本身的值增加 5」的意思喔。 當然依此類推,加、減、乘、除,甚至取餘都可以用喔! 此外,如果只是單純 +1 和 -1 還有更好用的 a++; 或 a--; 可以用喔! 接下來談談所謂的「運算子」和「運算元」 「運算子」就是加減乘除一類的,對「運算元」做特定運算的符號。 而「運算元」則是數字、變數等等,被運算的東西。 運算子有分三種,一元運算子、二元運算子和三元運算子。 一元運算子是只對一個運算元做運算,二元則是對兩個,…依此類推。 一元和三元目前還沒見到,先不提好了XD 二元的話如加、減、乘和除之類的都是。 其它還有更特殊的「比較運算子」如 >、<、==、!= 等等, 甚至是「邏輯運算子」如 &&、|| 等等,其它還有位元運算子等暫時用不上,先不提。 像除法沒什麼好講的,a / b 即對兩個運算元 a, b 做 a 除以 b 的計算, 結果就是 a 除以 b 的商。 比較運算子的話,則是回傳 1 (true) 或是 0 (false)。 注意 C 語言默認只有 0 是 false,不是 0 一律視為 true。 例如 5 > 3,則 > 對兩個運算元 5 和 3 做了比較的運算,如果 5 確實大於 3, 則運算結果為 1,否則為 0。 而邏輯運算子則差不多,像 a && b 則是若兩邊皆為 true 則運算結果為 1 (true), 否則為 0 (false)。補充一下,C 的 && 和 || 很聰明的唷。 如果 || 的左邊那個得到 true,右邊就略過不去計算; 如果 && 的左邊那個得到 false,右邊就略過不去計算。 這個性質很好玩的喔!例如: (i%2 || (i/=2 && 0)) && (i=i*3+1) 相當於 if(i%2 == 0) { i /= 2; } else { i = i * 3 + 1; } 奇妙吧? 因此,其實在 if() 的小括號裡面是要放一個運算式,若運算結果為 true 則執行。 不管是比較還是邏輯都是運算子,所以放的其實是一個運算式。 寫像 if( 3 + 6 ) 也是可以的喔。 所以啦,由此可見,是不可以寫如下的唷 if(5 < a < 10) 應該要寫 if(5 < a && a < 10) 否則…且讓我們來看看結果。 5 < a < 10 就運算優先來看,會先計算 5 < a 可是結果不管是 1 還是 0,都是 < 10 的,所以此條件變成永遠成立。 接下來談談 printf() 和 scanf() 為何 scanf("%d", &n) 會要加上 & 呢? 這是因為,如果只是寫 n,則會傳入 n 的值給這個函式。 可是,它讀入後是要找地方放,你告訴它我要放的地方長什麼樣子, 好比告訴你你得去台大上學,可是我不告訴你台大在哪,只給你一張台大的照片。 這還好,至少它還唯一;萬一是你們所約定的一處草地上呢?難找了吧。 所以呢,scanf() 就默認你給它的是一個地址,而不是數值。 如果你把數值當地址給它,那麼很可能會出事。 好比你拿一個蘋果給別人,說這就是我家住址一樣令人迷惑。 但是 printf() 這裡,我們是要輸出數值,那麼直接告訴它數值比較好。 假設有人問你某題數學怎麼寫,你明明會,卻告訴他我把解法畫在男一地下室牆上一樣。 直接告訴他解答不是比較直接了當嗎? 因此它也假設你很貼心地這麼做,如果你不小心手誤… printf("%d\n", &n); 你把 n 的地址告訴了它,它卻很開心地以為你要輸出的就是地址。 可是你想輸出的是數值對吧?所以你該做的是告訴他數值,而不是地址喔。 這樣大家應該有對變數方面有更進一步的了解了吧? 希望不是感到更加迷惘XDDD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.240.202 ※ 編輯: sa072686 來自: 140.112.240.202 (09/18 01:47)
vanillaXleft:woo~~ 好強大喔 推+1 09/18 03:11
lockercho:建議:可不可以把強者教學文放精華啊XD 09/18 23:11
averangeall:推樓上的建議 09/18 23:14
LoganChien:好強大,原來 Short-Circuit Evaluation (驟死求值式?) 09/21 00:10
LoganChien:可以這樣用。(i%2 || (i/=2&&0) && (i = i * 3 + 1)) 09/21 00:11
LoganChien:雖然,我很早就知道 Short-Circuit Evaluation,但是我 09/21 00:17
LoganChien:還沒有看過這一種方法。 09/21 00:17
LoganChien:長一點見識了。(話說,這是不是 3n+1 problem?) 09/21 00:18
ming1053:指標還有得玩... 09/21 00:23
sa072686:是3n+1沒錯,樓上上好強大啊… 指標好玩XDD 09/21 01:05