c語(yǔ)言
一 語(yǔ)法
第一章 類型蛤虐,運(yùn)算符與表達(dá)式
1.變量
1.1 變量名
變量標(biāo)識(shí)符只可以使用字母墩弯,下劃線以及數(shù)字零远,其中標(biāo)識(shí)符的開(kāi)頭必須是字母或下劃線叙凡。
下劃線開(kāi)頭的變量一般是擴(kuò)展或?qū)崿F(xiàn)疆柔,用戶不應(yīng)該直接使用咒精。
變量是區(qū)分大小寫(xiě)的,我們一般用小寫(xiě)來(lái)標(biāo)識(shí)變量旷档,大寫(xiě)來(lái)標(biāo)識(shí)常量模叙。
變量名不能與關(guān)鍵字沖突。
1.2 變量與常量
變量是可以變化的鞋屈,有的時(shí)候我們不想要變量被改變范咨,可以使用 #define
定義一個(gè)宏,或者使用 const
關(guān)鍵字對(duì)變量進(jìn)行限定厂庇。前者是狹義上的常量渠啊。
2. 數(shù)據(jù)類型及長(zhǎng)度
2.1 基本數(shù)據(jù)類型c89
-
char
: 1個(gè)字節(jié) -
short
: 2個(gè)字節(jié) -
int
: 2 或 4個(gè)字節(jié) -
long
: 4 或 8個(gè)字節(jié) -
float
: 4 個(gè)字節(jié) -
double
: 8 個(gè)字節(jié)
添加 unsigned
,長(zhǎng)度不變权旷,范圍則從0開(kāi)始替蛉。
2.2 新增數(shù)據(jù)類型c99
-
long long
:8 個(gè)字節(jié) -
long doble
: 長(zhǎng)度不定 -
_Bool
: 1個(gè)字節(jié),需要包含stdbool.h
-
int_8
,int_16
,int_32
... 需要包含inttypes.h
3. 常量
3.1 數(shù)字類型常量
-
123
: 默認(rèn)為int
類型的常量, 后綴l
或L
則為long
類型, 如123L
躲查。 - 如果一個(gè)數(shù)字太大它浅,超過(guò)
int
的范圍,則被當(dāng)作long
類型進(jìn)行處理熙含。 - 無(wú)符號(hào)常量用
u
或U
進(jìn)行結(jié)尾罚缕, 如123u
表示unsigned int
類型,u
/U
可以與l
/L
一起使用怎静, 如1111UL
表示unsigned long int
類型邮弹。 -
123.45
: 浮點(diǎn)數(shù)默認(rèn)為double
類型,后綴f
/F
蚓聘, 則表示為float
類型腌乡。
3.2 八進(jìn)制,十六進(jìn)制的整型
-
011
: 0開(kāi)頭的數(shù)字表示8進(jìn)制夜牡,這里011
即十進(jìn)制的9
-
0X11
/0x11
:0x
或0X
開(kāi)頭的數(shù)字表示16進(jìn)制整數(shù)与纽, 這里的0x11
即 17 - 轉(zhuǎn)義字符: 并不是所有的字符都可以打印出值。
3.3 字符常量
字符常量是整數(shù)類型的一種塘装, 因此可以直接與整數(shù)進(jìn)行運(yùn)算:
char c;
c = 'a';
c += 1;
我們知道字符類型的最長(zhǎng)長(zhǎng)度為255急迂,整數(shù)類型可以用八進(jìn)制與十六進(jìn)制標(biāo)識(shí),字符類型同樣可以蹦肴。
-
'\111'
:char
類型僚碎,值為 73, 以下程序打印 173
#include <stdio.h>
int main()
{
int n = 100;
char c = '\111';
printf("n+c: %d", n+c);
return 0;
}
-
\1a
:char
類型阴幌, 值為 26
3.4 字符常量
-
abcde
: 字符常量創(chuàng)建的其實(shí)是字符數(shù)組勺阐,末尾自動(dòng)添加\0
-
\0
: 字符串的結(jié)尾, 其值為0
4.枚舉常量
- 枚舉常量與#define作用類似矛双,但枚舉常量有類型檢查渊抽,不檢查賦值是否在合法范圍內(nèi),只檢查類型议忽。
- 枚舉常量是一個(gè)小范圍的整形常量列表
- 枚舉常量的默認(rèn)值是從0開(kāi)始懒闷,第二個(gè)為1,如果指定了部分枚舉值栈幸,則后面的值依次類推愤估。
- 枚舉值的名字不能相同,但是值可以相同
#include <stdio.h>
enum DAY {
ONE = 1, TWO = 2
};
int main() {
enum DAY day;
day = 3;
// day: 3
printf("day: %d", day);
return 0;
}
5.聲明
5.1 普通類型聲明
所有的變量都應(yīng)該先聲明后使用侦镇。
-
一個(gè)聲明指定一種變量類型,后面可以跟1個(gè)或多個(gè)變量织阅。
#include <stdio.h> int main() { char * name, line[10]; name = "bbb"; line[0] = 'a'; line[1] = '\0'; // line: a, name: bbb printf("line: %s, name: %s", line, name); return 0; }
變量聲明時(shí)壳繁, 指針只是對(duì)變量的修飾,與變量是綁定的,并不會(huì)影響聲明的類型闹炉。如上述例子中蒿赢,
char * name, line[10];
與char * name; char line[10];
效果是相同的。可以在變量進(jìn)行聲明的同時(shí)進(jìn)行初始化渣触。
int c = 100;
變量的初始化是在程序開(kāi)始之前進(jìn)行的羡棵,因此我們變量的初始化必須是常量表達(dá)式。
-
默認(rèn)情況下嗅钻, 全局變量/外部變量與靜態(tài)變量會(huì)被初始化為0皂冰;未經(jīng)顯示初始化的值為未定義的值。
#include <stdio.h> int g; char name[10]; int main() { int c; // c 每次都是一個(gè)隨機(jī)值, g 固定為 0, name 為空字符串 printf("c: %d, g:%d, name: %s\n", c, g, name); return 0; }
5.2 const
修飾符限定的聲明
-
const
修飾基礎(chǔ)類型养篓,則該變量的值不能更改秃流。const int c = 100; c = 10; // error: cannot assign to variable 'c' with const-qualified type 'const int'
-
const
修飾數(shù)組/字符串指針,則數(shù)組的元素不能修改const int nums[10] = {1, 2, 3}; nums[0] = 100; // error: cannot assign to variable 'nums' with const-qualified type 'const int [10]'