2018-03-16 23:51:20 +08:00
|
|
|
|
2.1 C基础语法
|
|
|
|
|
===
|
|
|
|
|
# 2.1.1 关键字
|
|
|
|
|
|
|
|
|
|
以下单词或字符在C语言中有特殊含义,称作关键字:
|
|
|
|
|
|
|
|
|
|
* include
|
|
|
|
|
* define
|
|
|
|
|
* ifdef
|
|
|
|
|
* ifndef
|
|
|
|
|
* endif
|
|
|
|
|
* extern
|
|
|
|
|
* typedef
|
|
|
|
|
* static
|
|
|
|
|
* const
|
|
|
|
|
* struct
|
|
|
|
|
* union
|
|
|
|
|
* void
|
|
|
|
|
* signed
|
|
|
|
|
* unsigned
|
|
|
|
|
* char
|
|
|
|
|
* short
|
|
|
|
|
* int
|
|
|
|
|
* long
|
|
|
|
|
* float
|
|
|
|
|
* double
|
|
|
|
|
* if
|
|
|
|
|
* else
|
|
|
|
|
* for
|
|
|
|
|
* do
|
|
|
|
|
* while
|
|
|
|
|
* break
|
|
|
|
|
* continue
|
|
|
|
|
* goto
|
|
|
|
|
|
|
|
|
|
以上关键字的作用将在后续章节讲解。
|
|
|
|
|
|
|
|
|
|
# 2.1.2 特殊符号
|
|
|
|
|
|
|
|
|
|
C语言中常会用到以下符号:
|
|
|
|
|
|
|
|
|
|
* 赋值运算:=、+=、-=、*=、/=、%=、&=、|=
|
|
|
|
|
* 算数运算:+、-、*、/、%、++、--
|
|
|
|
|
* 比较运算符:==、>=、<=、!=、>、<
|
|
|
|
|
* 逻辑运算:&&、||、!
|
|
|
|
|
* 位运算:&、|、~、^、>>、<<
|
|
|
|
|
* 指针运算:*、&
|
|
|
|
|
* 其他:;、#、{、}、[、]、0x、0b、//、/\*、\*/
|
|
|
|
|
|
|
|
|
|
以上符号中的运算符将在学习数据类型之后进行说明。
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.3 注释
|
|
|
|
|
|
|
|
|
|
注释是一些说明性的文字,他并不影响程序的逻辑、执行和运算。仅仅是帮助编程开发人员更好阅读和理解代码。
|
|
|
|
|
C语言有行注释和块注释,下面是几个行注释:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
// 这是一个行注释。
|
|
|
|
|
// This is a line comment.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
下面是一个块注释:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
/*
|
|
|
|
|
* @author: lion chen cy187lion@sina.com
|
|
|
|
|
* @brief: 这是一个Doxygen风格的块注释。
|
|
|
|
|
*/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
C语言的编码和注释有很多种风格,你会发现每种风格有各自的优缺点。你可以尝试多种风格,但成熟的软件系统会采用统一的风格,这样的要求经常由《编码规范》来约定。
|
|
|
|
|
# 2.1.4 字面常量
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
|
|
|
|
常量可以理解为固定不变的量,是与变量相对的概念。常量一经申明变不允许再发生改变。以下均是常量:
|
|
|
|
|
|
|
|
|
|
* 16、0xFA90、0b1010
|
|
|
|
|
* 25.1
|
|
|
|
|
* "Have Fun!"、'x'、"15996699996"、"2\*3.1415926535898\*r"
|
|
|
|
|
|
|
|
|
|
常量的不变性是指如下赋值语句都是错误的:
|
|
|
|
|
|
|
|
|
|
* "var"="Have Fun!"
|
|
|
|
|
* "var"=1024
|
|
|
|
|
* 16=0x16
|
|
|
|
|
|
|
|
|
|
而下列写法是可以编译通过的:
|
|
|
|
|
|
|
|
|
|
* "var"=="Have Fun!"
|
|
|
|
|
* "var"!=1024
|
|
|
|
|
* 16<0x16
|
|
|
|
|
|
|
|
|
|
因为以上并非赋值语句,而是比较语句。通过英文双引号表达的是字符串变量,他们可以是一串字符。使用英文单引号表达的是字符常量,他只可以包含一个字符。而类似于16、25.1这种的是数字量。数字量分为整数和浮点数,他们有多种方式去表达方式。
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.5 整数的表达方式
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
|
|
|
|
除了常用的十进制方式以外,在C语言甚至其他语言中,还经常用到二进制和十六进制数。
|
|
|
|
|
|
|
|
|
|
* 0b 开头的表达二进制数,仅使用0、1表达
|
|
|
|
|
* 0x 开头的表达十六进制数,除0~9外,使用A~F来表达10~15
|
|
|
|
|
|
|
|
|
|
二进制、十进制、十六进制间通过 8421BCD 码进行转换。
|
|
|
|
|
|
|
|
|
|
* 二进制:0b 1010
|
|
|
|
|
* 十进制:1\*2^3+0\*2^2+1\*2^1+0\*2^0
|
|
|
|
|
* 也就是:1\*8+0\*4+1\*2+0\*1
|
|
|
|
|
|
|
|
|
|
且每 4 位二进制数可表示一位十六进制数:
|
|
|
|
|
|
|
|
|
|
* 二进制:0b 1010 0101
|
|
|
|
|
* 十六进制:0xA5
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.6 变量
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
|
|
|
|
在C语言中,可以使用字符来表示数字量或字符串等。就好像数学里用x表示一些数那样。这样的量,可以被反复修改,被称作变量。变量只可以使用英文字符或下划线“_”开头,可包含0~9的数字,不可包含其他字符。以下是一些变量:
|
|
|
|
|
|
|
|
|
|
* int aint
|
|
|
|
|
* unsigned long _along
|
|
|
|
|
* double flt0, flt1, flt2
|
|
|
|
|
* void* pointer
|
|
|
|
|
|
|
|
|
|
变量需要被定义才能够使用,在定义变量的时候,在变量前面的用于描述变量的C关键字表示了变量的类型和作用范围。
|
|
|
|
|
例如 static 表示变量是静态的,而 short 表示了有符号的32位整数。
|
|
|
|
|
所谓有符号、无符号,即变量所表示的数是否包含负数。
|
|
|
|
|
|
|
|
|
|
* unsigned char: 0~255
|
|
|
|
|
* signed char:-128~127
|
|
|
|
|
* char = signed char
|
|
|
|
|
|
|
|
|
|
char是8位数,可表示2^8=256个数,无符号的char从0开始,取256个整数,最大是255。当表示有符号数时,则用128个数表示-1~-128,另一半表示0~128。
|
|
|
|
|
其他类型的位数为:
|
|
|
|
|
|
|
|
|
|
* short 16位
|
|
|
|
|
* int 32位
|
|
|
|
|
* long 与总线位宽有关,不低于32位
|
|
|
|
|
* long long 64位
|
|
|
|
|
* float 32位浮点数,非常不精确
|
|
|
|
|
* double 64位浮点数,精确
|
|
|
|
|
|
|
|
|
|
另一种变量是如下定义的:
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
```cpp
|
|
|
|
|
int* pointer;
|
|
|
|
|
```
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
这种变量被称作指针,或指针变量。
|
2018-03-16 23:51:20 +08:00
|
|
|
|
之前我们说变量的值可以被反复修改,也就是可以这样做:
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
```cpp
|
|
|
|
|
int aint;
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
aint = -56; // 初始化赋值。
|
|
|
|
|
aint += 3;
|
|
|
|
|
aint ++
|
|
|
|
|
```
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
|
|
|
|
这种做法叫做变量赋值。有时候我们需要在定义变量的时候就为变量赋值,可以这样做:
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
```cpp
|
|
|
|
|
double aflt = 3.14;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
变量的第一次赋值被称作初始化。注意,如果一个变量没有经过初始化就被使用了,那是很危险的,尤其是没有初始化的指针变量。
|
|
|
|
|
通常,在定义一个变量的同时,我们就声明了他,但是这个变量通常只在当前源文件中可见,而一个软件项目会包含很多源文件。如果我们想在另一个源文件中使用这个变量,就需要声明他。例如,在 a.c 这个源文件中定义和初始化变量
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
/**
|
|
|
|
|
* @file: a.c
|
|
|
|
|
*/
|
|
|
|
|
short ashort=16;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
然后我们在 b.c 文件中声明并使用他
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
/**
|
|
|
|
|
* @file: b.c
|
|
|
|
|
*/
|
|
|
|
|
extern short ashort;
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
ashort++;
|
|
|
|
|
```
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.7 符号常量
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.8 运算符
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.9 宏
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.10 指针
|
2018-03-16 23:51:20 +08:00
|
|
|
|
|
|
|
|
|
指针变量的长度与总线位宽有关,如32位机则指针变量长度为4,64位机为8。
|
|
|
|
|
|
2018-03-17 00:28:57 +08:00
|
|
|
|
# 2.1.11 语句
|
|
|
|
|
# 2.1.12 头文件
|