學習一門新的程式語言的唯一途徑就是使用它編寫程式。對於所有語言的初學者來說,編寫的第乙個程式幾乎都是相同的,即;
列印出以下內容
hello, world
儘管這個練習很簡單,但對於初學語言的人來說,它仍然可能成為一大障礙,因為要實現這個目的,我們首先編寫程式文字,然後成功地進行編譯,並載入、執行,最後輸出到某個地方。掌握了這些操作細節後,其他事情就比較容易了。
#include //包含標準庫的資訊
main() //定義名為main的函式,它不接受引數值
// \n代表換行符
在linux系統中,輸入 gcc hello.c && ./a.out
編譯、載入、執行
0 -17
20 -6
40 4
60 15
80 26
100 37
120 48
140 60
160 71
180 82
200 93
220 104
240 115
260 126
此程式中仍然只包括乙個名叫main的 函式定義。它比前面的hello.c 的程式長一些,但並並不複雜。這個程式中引入了一些新的概念,包括注釋、宣告、變數、算術表示式、迴圈以及格式化輸出。
#include /* 當fahr= 0, 20, ..., 300時,分別列印華氏溫度與攝氏溫度對照表 */
main()
}
/* 與*/之間的字串行將被編譯器忽略。注釋可以自由的運用在程式中,使得程式更易於理解。程式中允許出現空格、製表符或換行符之處,都可以使用注釋
在c語言中所有變數都必須先宣告後使用。宣告通常放在函式起始處,在任何可執行語句之前。宣告用於說明變數的屬性,它由乙個型別名和乙個變數表組成,例如:
int fahr,celsius;
int lower,upper,step;
其中int 表示後所列變數為整數,與相對應的,float表示所列變數為浮點數。int 與float 型別的取值範圍取決於具體的機器。對於int型別通常為16位,其範圍在-32768~+32767之間,也有用32位表示的int型別。float通常為32位,其至少有6位有效數字。
c語言還提供了其他一些基本資料型別:
char 字元---乙個位元組
short 短整型
long 長整型
double 雙精度浮點型
這些資料型別物件的大小也取決於具體的機器。還存在這些基本資料型別的陣列、結構、聯合,指向這些型別的指標以及返回這些型別值的函式。我們將在後續響應的章節中分別介紹。
在上面的溫度轉換程式中,最開始計算是下列4個賦值語句:
lower = 0;
upper = 300;
step = 20;
fahr = lower;
它們為變數設定初值。各條語句均以分號結束。
溫度轉換表中的各行計算方式相同,因此可以用迴圈語句重複輸出各行。這是while迴圈語句的用途:
while (fahr <= upper)for 語句是一種迴圈語句,它是對while 語句的推廣。如果將for語句與前面介紹的while語句比較,就會發現for語句的操作更直觀一些。
fahr=0 是初始化部分,僅在進入迴圈前執行一次。
fahr <=300 是控制迴圈的測試或條件部分。迴圈控制將對該條件求值,如果結果為真(true)則執行迴圈體
fahr = fahr + 20 以將迴圈變數fahr 增加乙個步長,並再次對條件求值。如果計算的到的條件值為假迴圈將終止執行。與while語句一樣,for迴圈語句的迴圈體可以只有一條語句,也可以是用花括起來的一組語句。
#define指令可以把符號名定義為乙個特定的字串
#define 名字 替換文字
在該定義之後,程式**現的所有在#define中定義的名字,都將用相應的替換文字替換。其中,名字與普通變數名的形式相同:他們都是以字母打頭的字母和數字序列;替換文字可以是任何字串行,而不僅限於數字。
符號常量通常是大寫字母,這樣可以很容易與用小寫字母拼寫的變數名相區別。注意#define指令行的末尾沒有分號
標準庫提供的輸入/輸出模型非常簡單。無**本從何處輸入,輸出到何處,其輸入/輸出都是按照字元流的方式處理。文字流是由多行字元構成的字串行,而每行字元則由0個或多個字元組成,行末是乙個換行符。
標準庫提供了一次讀/寫乙個字元的函式,其中最簡單的是getchar和putchar兩個函式。每次呼叫時,getchar函式從文字流中讀入下乙個輸入字元,並將其作為結果值返回。
1.5.1 檔案複製
借助於getchar與putchar函式,可以在不了解其他輸入/輸出知識的情況下編寫出數量驚人的有用的**。最簡單的例子就是把輸入一次乙個字元的複製到輸出,其基本思想如下
#include main()
}
其中,關係運算子 !=表示 「不等於」
字元在鍵盤、螢幕或其他的任何地方無論以什麼形式表現,它在機器內部都是以位模式儲存的。char型別專門用於儲存這種字元型資料,當然任何整型(int)也可以用於儲存字元型資料。因為某些潛在的重要原因,我們在此使用int型別
1.5.2 字元計數
下列程式對於字元進行計數,它與上面的複製程式類似。
#include main ()
其中,語句
++nc;
引入了乙個新的運算子++,其功能是執行加1操作。可以用語句nc=nc+1代替它,但語句++nc更精煉一些,且通常效率更高。
與該運算子響應的是自減運算子--。++與--這兩個運算子既可以作為字首運算子也可以作為字尾運算子。
1.5.3 行計數
統計行計數等價於統計換行符的個數。
#include main()
在該程式中,while迴圈語句的迴圈體是乙個if語句, 他控制自增語句++nl。if語句先測試圓括號中的條件,如果該條件為真,則執行其後的語句。這裡再次用縮排方式表明語句之間的控制關係。
雙等於號==是c語言中表示「等於」關係的運算子(類似於pascal中的單等於號=及fortran中的.eq)由於c語言將單等於號作為複製運算子,因此使用雙等於號==表示相等的邏輯關係,以示區分。
1.5.4 單詞計數
用於統計行數、單詞數與字元數。這裡對單詞的定義比較寬鬆,它是任何其他不包含空格、製表符或換行符的字串行。
#include #define in 1
#define out 0
main()
} printf("%d %d %d\n", nl, nw, nc);
}
程式執行時,每當遇到單詞的第乙個字元,它就作為乙個新單詞加以統計。state變數記錄程式當前是否正位於乙個單詞之中,它的初值是「不在單詞中」,即初值被賦為out。
編寫乙個程式,以統計各個數字、空白符以及所有其他字元出現的次數。這個程式的實用意義並不大,但我們可以通過該程式討論c語言多方面的問題。
#include main ()
到目前為止,我們所使用的函式(如printf、getchar和putchar)都是函式庫中提供的函式,現在讓我們
編寫函式。現在編寫乙個求冪的函式power(m,n)來說明函式定義的方法。用於計算整數m的n次冪,其中n是正整數。對函式呼叫
power(2,5)來說,結果為32。
#include int power (int m, int n);
main()
int power(int base, int n)
函式定義可以以任意次序出現在乙個原始檔或多個原始檔中,但同一函式不能分割存放在多個檔案中。每次呼叫時,main函式返回乙個格式化的整數並列印。在表示式中,power(2,i)同2和i一樣都是整數。
傳值呼叫的利大於弊。在被呼叫函式中,引數可以看作時便於初始化的區域性變數,因此額外使用的變數更少,這樣程式可以更緊湊簡潔。
用來存放字元的陣列稱為字元陣列,例如:
char a[10]; //一維字元陣列
char b[5][10]; //二維字元陣列
char c[20]=; // 給部分陣列元素賦值
char d=; //對全體元素賦值時可以省去長度
字元陣列實際上是一系列字元的集合,也就是字串(string)。在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。
如果在該函式內定義了乙個與之前定義的全域性變數同名的變數,那麼該同名區域性變數就會在函式內部遮蔽全域性變數的影響。即當區域性變數與全域性變數同名時,在區域性變數的作用範圍之內,全域性變數不起作用。區域性變數優先原則;
全域性變數是有預設值的(引用型別的變數預設值都是null,基本型別的變數預設值則不一樣,int型變數預設值是0),但是區域性變數沒有預設值;
全域性變數可以在函式外定義並初始化,但不能進行賦值操作。
C語言學習筆記
include include void swap int p1,int p2 void swapa int arr,int n void printfa int arr,int n int main int argc,char argv swap i,j printfa array,6 swapa...
C語言學習筆記
file 結構 包含在stdio.h裡 ifndef file defined struct iobuf typedef struct iobuf file define file defined endif fread 功 能 從乙個流中讀資料 函式原型 size t fread void buf...
C語言學習筆記
我們學習c語言最開始入門的時候,都是先從c語言學習 c語言教材書籍開始學習,這些是我摘要的一些內容。第一章 c 語言概述 語言概述 1.1 物件導向程式設計基本概念 1.2 c 語言是一種物件導向的程式設計 語言 1.3 c 程式結構的特點 程式結構的特點 1.4 visual c 6.0簡介 簡介...