輸入便是傳入訊息給程式,輸出便是程式傳出訊息給我們。
如果沒有輸入,我們無法操作程式,能做的事就會受限。想像一下沒有按鍵的計算機,或是沒有搖桿的電玩機台!
如果沒有輸出,便無法接收程式執行的結果。想像一下不會顯示答案的計算機,或是沒有螢幕的電腦!
儘管一個程式並不一定要有輸出輸入才算完整,但會很不方便。
首先先記住這招起手式:
#include <stdio.h>
int main()
{
return 0;
}
這是C語言的萬用起手,即使是萬丈高樓也是從平地打下地基開始的;這幾行就是一切的根本,但是一切才剛要從這裡開始!
至此已經可以按F9編譯並執行這段程式碼了。你問我什麼是編譯?
光是程式碼就只是一些文字罷了,透過編譯將其轉成執行檔後,才能真正執行!
不過執行了也只是跑出一個小黑窗,然後馬上消失。這很正常,因為這程式什麼都沒做。
現在讓我們看一下這起手式在做什麼:
#include <stdio.h> <== A
int main() <== B
{ <== C
return 0; <== D
} <== E
我們先將其切成五塊,然後一塊一塊吃掉…不對,解釋!
A: 由#開頭屬於預處理的一種,也就是做一些「程式執行前要做的事」。這行的意義是引入「標準輸出輸入函式庫(*1)」,你可以看作C語言送我們一套新手VIP商城禮包,裡面有很多小妖精!可以幫我們處理掉許多必要、卻很麻煩的事!
B: 宣告名為main的函式,這是「程式的進入點」。也就是說程式真正執行,從這兒開始!
C&E: 宣告「main函式的範圍」。圈在這對大括號內的,全是main的地盤!同時也代表這程式所要執行的所有指令都在這裡!
D: 執行這行代表結束掉main函式,這意味著程式的中止。
*1: stdio.h 為 STanDard Input & Output 的簡寫,.h表示標頭檔的副檔名。
所以這是個「任務中第一條命令即為任務中止」的程式。因此它什麼也不會做。
但是它有方便的小妖精、有開始、有結束,非常完整,之後希望它做什麼,直接在這結構的開始與結束中間,加上你希望的指令就行!
首先先讓它表示服從,加入這行:
printf("Hello my master!");
printf()是一個我們在引入函式庫時,拿到的小妖精(函式)之一,先呼叫牠的大名將牠召喚出來,再將我們想顯示在螢幕上的文字拿給它,牠就會幫我們顯示上去喔~
;代表一個指令結束了!一定要加喔不然編譯會失敗,而且會失敗在下一行!因為它在找分號,找到下一行還找不到才終於死心,跟你說他看不懂不知道怎麼辦~
"Hello my master!"就是我們要它輸出的文字了~用""包起來,代表這是一段「文字」而不是「指令」的一部份,不加會被當作指令解讀,就會出錯喔~
所以這行的意思就會是:
printf <== 將「文字」顯示在螢幕上用的小妖精(正式統稱為函式,但是小妖精比較可愛)
( <== 想傳給小妖精的東西,放在這對小括號內,小妖精就會收到了~
"Hello my master!" <== 想傳給小妖精的東西,是一段文字
)
; <== 一個指令結束
小知識: C語言其實並不具備將「文字」顯示在螢幕上的指令,但是有提供持有這種技能的小妖精,以及呼叫小妖精的指令!不過牠事情一處理完就會馬上回家啦~
小知識: C語言其實並不具備將「文字」顯示在螢幕上的指令,但是有提供持有這種技能的小妖精,以及呼叫小妖精的指令!不過牠事情一處理完就會馬上回家啦~
在C語言,一個指令真的可以這樣分好幾行寫喔!當然你不能把單字也拆了,像printf這六個字不能拆開的,會破壞原本的意思。拆成上述這樣並不會破壞原本的意思,所以是可以的喔。
不加上;的話,真的不知道一個指令到哪結束喔!
當我們將一個「函式」的名字加上一對小括號作為指令,表示「呼叫」它;小括號則放入要告知這函式的相關「訊息」。
好比要女僕打掃,除了下達「打掃」的命令,也要告訴他希望打掃的「地方」,以及「方式」(或掃到多乾淨等)等等細節。就像要計算機幫你計算,也得告訴它你想算的是什麼。
要叫小妖精顯示文字,同樣也得告訴它,你想顯示什麼樣的文字。
現在我們了解它了,問題是說要加入,怎麼加?我們來試試看:
肯定是加在「程式進入點」之後,「程式中止」之前…
#include <stdio.h>
int main() <== 在這之後
printf("Hello my master!"); <== 放在這?
{
return 0; <== 在這之前
}
好的,讓我們往回看;這段程式碼會是什麼意思呢?
#include <stdio.h> <== 找工具箱
int main() <== 程式進入點
printf("Hello my master!"); <== 指令: 表示服從
{ <== 程式進入點的地盤開始
return 0; <== 指令: 程式中止
} <== 程式進入點的地盤結束
好的顯然我們的指令沒在main的地盤裡面,這絕對很奇怪呀!肯定是哪兒錯了!
所以把它放在地盤裡吧?
#include <stdio.h>
int main() <== 在這之後
{printf("Hello my master!"); <== 放在這?
return 0; <== 在這之前
}
沒錯這樣解釋起來非常通順完全沒問題,但是不覺得很醜嗎?讓我們修改一下:
#include <stdio.h>
int main() <== 在這之後
{
printf("Hello my master!"); <== 放在這?
return 0; <== 在這之前
}
整齊多啦!廢話不多說讓我們來看看令人興奮的一刻: 我們讓電腦表示服從了!
用力給它戳下F9啦!
咻!
…
……
………
小黑窗顯示出「Hello my master!」之後,不知道是害羞還是怎地,以迅雷不及掩耳的速度關起來了!根本來不及看清啊?…
原來是顯示完這行字,小妖精任務完成後一回家,下個指令便是程式中止,所以便立刻關閉啦!
那怎麼辦好?把中止指令return 0;拿掉嗎?是可以試試看,但一發現地盤結束,後面沒指令了也是會立刻關了,一點意義都沒有…
只好先想辦法讓程式執行停下,別結束得太快;所以我們修改一下:
#include <stdio.h>
int main()
{
printf("Hello my master!");
scanf(" "); <== 加上這個就會暫時停下啦!
return 0;
}
哈哈這次看你往哪逃!F9按下去,果然乖乖停住啦~
當然你高興的話也可以讓他說出各種害羞的話,這就看個人喜好而定啦!
不過呢最好不要使用中文,當然可以用啦但容易出現預料外的情形,詳細原因現在太難解釋,請期待番外篇~
如果我們希望它多說點話呢?比如說唱唱國歌之類的~
這還不簡單嗎!我們說printf是只要叫出它的真名,再告知他一些必要資訊,它就會幫我們做「把文字顯示到螢幕上」這件事,對吧?
依此類推的能力,可是非常重要的喔!孔子也說舉一隅要以三隅反不是嗎?
所以…叫一次不夠,那你有叫第二次嗎?
#include <stdio.h>
int main()
{
printf("Hello my master!");
printf("what can i do for you, master?");
scanf(" "); <== 加上這個就會暫時停下啦!
return 0;
}
輕鬆解決啦!F9給它戳下去~
Hello my master!what can i do for you, master?
WTF!?怎麼黏到同一行去了!
喔~原來啊,電腦是很聽話的,叫他做什麼就做什麼,但是不會很體貼地幫你多做任何事!
畢竟這體貼要是猜錯方向,那可慘啦!敢想像你的手腳會為了保護你,在你被欺負時幫你揮出一記重拳?爽是爽,後續可也不知道會怎樣呢!
從這兩個printf中完~全看不到有要換行的意思,電腦不敢妄自猜測,自然不換啦!
因此我們必須自己告訴它,我們要換行!可換行怎辦?說到換行想到誰?ENTER!
printf("Hello my master!
");
哇,這下壞掉啦,連編譯都失敗啦!怎麼辦?
顯然,擅自加入換行會讓電腦對整個指令的解讀出現困惑的!
其實啊,送給printf的文字是有「約定的暗號」存在的喔!
像換行就有暗號存在,只要在裡面寫\n就代表換行的意思。要注意斜線的方向,別打錯囉!
所以我們改成:
printf("Hello my master!\n");
printf("what can i do for you, master?\n");
F9測試一下,哇、果然真的換行了!
雖然手動換行比較麻煩,但如果一次printf會自動幫你換行一次,有時也挺頭痛的呢!
所以啦,這頭痛的情況是因為我們擁有控制一切的力量!
正因為一切都在我們掌握之中,所以會比較麻煩,就忍忍吧!這是自由的代價!
你可能會覺得奇怪,最後一句我們都說完了,為什麼還要換行呢?
其實換行並不只是換到新的一行喔!它真正的意義是「一行的結束」(End-Of-Line)。
如果最後一句不加上\n讓它結束,就會變成是未完結的一行喔!
這也是一個好習慣,日後在底下追加新的文字時,比較不容易忘了加\n而導致排版毀滅。
平時養成良好習慣,寫程式時較不易出現非預期的狀況喔!
練習是很重要的,試著不要複製貼上,自己從頭寫個程式玩玩看!
多嘗試、多實驗會讓你體會更多喔!只是照抄是學不起來的。
先想好你希望你的程式做些什麼,再想想這樣的程式需要哪些東西,連起手式都自己思考建構,最後一步步完成它,這才真正將這些知識轉換成自己的力量!
因為你不再只是看著魔法書照著唸,而是能在心中從頭構築整個完整巫術並自由使用!
作為最後的練習題,試著寫個程式告白吧!
執行之後就會顯示告白內容,這樣就行了!很浪漫吧?
作為衍生也可以當生日卡賀年卡之類的來使用!
int main() <== 在這之後
printf("Hello my master!"); <== 放在這?
{
return 0; <== 在這之前
}
好的,讓我們往回看;這段程式碼會是什麼意思呢?
#include <stdio.h> <== 找工具箱
int main() <== 程式進入點
printf("Hello my master!"); <== 指令: 表示服從
{ <== 程式進入點的地盤開始
return 0; <== 指令: 程式中止
} <== 程式進入點的地盤結束
好的顯然我們的指令沒在main的地盤裡面,這絕對很奇怪呀!肯定是哪兒錯了!
所以把它放在地盤裡吧?
#include <stdio.h>
int main() <== 在這之後
{printf("Hello my master!"); <== 放在這?
return 0; <== 在這之前
}
沒錯這樣解釋起來非常通順完全沒問題,但是不覺得很醜嗎?讓我們修改一下:
#include <stdio.h>
int main() <== 在這之後
{
printf("Hello my master!"); <== 放在這?
return 0; <== 在這之前
}
整齊多啦!廢話不多說讓我們來看看令人興奮的一刻: 我們讓電腦表示服從了!
用力給它戳下F9啦!
咻!
…
……
………
小黑窗顯示出「Hello my master!」之後,不知道是害羞還是怎地,以迅雷不及掩耳的速度關起來了!根本來不及看清啊?…
原來是顯示完這行字,小妖精任務完成後一回家,下個指令便是程式中止,所以便立刻關閉啦!
那怎麼辦好?把中止指令return 0;拿掉嗎?是可以試試看,但一發現地盤結束,後面沒指令了也是會立刻關了,一點意義都沒有…
只好先想辦法讓程式執行停下,別結束得太快;所以我們修改一下:
#include <stdio.h>
int main()
{
printf("Hello my master!");
scanf(" "); <== 加上這個就會暫時停下啦!
return 0;
}
哈哈這次看你往哪逃!F9按下去,果然乖乖停住啦~
當然你高興的話也可以讓他說出各種害羞的話,這就看個人喜好而定啦!
不過呢最好不要使用中文,當然可以用啦但容易出現預料外的情形,詳細原因現在太難解釋,請期待番外篇~
如果我們希望它多說點話呢?比如說唱唱國歌之類的~
這還不簡單嗎!我們說printf是只要叫出它的真名,再告知他一些必要資訊,它就會幫我們做「把文字顯示到螢幕上」這件事,對吧?
依此類推的能力,可是非常重要的喔!孔子也說舉一隅要以三隅反不是嗎?
所以…叫一次不夠,那你有叫第二次嗎?
#include <stdio.h>
int main()
{
printf("Hello my master!");
printf("what can i do for you, master?");
scanf(" "); <== 加上這個就會暫時停下啦!
return 0;
}
輕鬆解決啦!F9給它戳下去~
Hello my master!what can i do for you, master?
WTF!?怎麼黏到同一行去了!
喔~原來啊,電腦是很聽話的,叫他做什麼就做什麼,但是不會很體貼地幫你多做任何事!
畢竟這體貼要是猜錯方向,那可慘啦!敢想像你的手腳會為了保護你,在你被欺負時幫你揮出一記重拳?爽是爽,後續可也不知道會怎樣呢!
從這兩個printf中完~全看不到有要換行的意思,電腦不敢妄自猜測,自然不換啦!
因此我們必須自己告訴它,我們要換行!可換行怎辦?說到換行想到誰?ENTER!
printf("Hello my master!
");
哇,這下壞掉啦,連編譯都失敗啦!怎麼辦?
顯然,擅自加入換行會讓電腦對整個指令的解讀出現困惑的!
其實啊,送給printf的文字是有「約定的暗號」存在的喔!
像換行就有暗號存在,只要在裡面寫\n就代表換行的意思。要注意斜線的方向,別打錯囉!
所以我們改成:
printf("Hello my master!\n");
printf("what can i do for you, master?\n");
F9測試一下,哇、果然真的換行了!
雖然手動換行比較麻煩,但如果一次printf會自動幫你換行一次,有時也挺頭痛的呢!
所以啦,這頭痛的情況是因為我們擁有控制一切的力量!
正因為一切都在我們掌握之中,所以會比較麻煩,就忍忍吧!這是自由的代價!
你可能會覺得奇怪,最後一句我們都說完了,為什麼還要換行呢?
其實換行並不只是換到新的一行喔!它真正的意義是「一行的結束」(End-Of-Line)。
如果最後一句不加上\n讓它結束,就會變成是未完結的一行喔!
這也是一個好習慣,日後在底下追加新的文字時,比較不容易忘了加\n而導致排版毀滅。
平時養成良好習慣,寫程式時較不易出現非預期的狀況喔!
練習是很重要的,試著不要複製貼上,自己從頭寫個程式玩玩看!
多嘗試、多實驗會讓你體會更多喔!只是照抄是學不起來的。
先想好你希望你的程式做些什麼,再想想這樣的程式需要哪些東西,連起手式都自己思考建構,最後一步步完成它,這才真正將這些知識轉換成自己的力量!
因為你不再只是看著魔法書照著唸,而是能在心中從頭構築整個完整巫術並自由使用!
作為最後的練習題,試著寫個程式告白吧!
執行之後就會顯示告白內容,這樣就行了!很浪漫吧?
作為衍生也可以當生日卡賀年卡之類的來使用!
沒有留言:
張貼留言