6.6 KiB
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、//、/*、*/
以上符号中的运算符将在学习数据类型之后进行说明。
2.1.3 注释
注释是一些说明性的文字,他并不影响程序的逻辑、执行和运算。仅仅是帮助编程开发人员更好阅读和理解代码。
C语言有行注释和块注释,下面是几个行注释:
// 这是一个行注释。
// This is a line comment.
下面是一个块注释:
/*
* @author: lion chen cy187lion@sina.com
* @brief: 这是一个Doxygen风格的块注释。
*/
C语言的编码和注释有很多种风格,你会发现每种风格有各自的优缺点。你可以尝试多种风格,但成熟的软件系统会采用统一的风格,这样的要求经常由《编码规范》来约定。
2.1.4 字面常量
常量可以理解为固定不变的量,是与变量相对的概念。常量一经申明变不允许再发生改变。以下均是常量:
- 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这种的是数字量。数字量分为整数和浮点数,他们有多种方式去表达方式。
2.1.5 整数的表达方式
除了常用的十进制方式以外,在C语言甚至其他语言中,还经常用到二进制和十六进制数。
- 0b 开头的表达二进制数,仅使用0、1表达
- 0x 开头的表达十六进制数,除0
9外,使用AF来表达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
2.1.6 变量
在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位浮点数,精确
另一种变量是如下定义的:
int* pointer;
这种变量被称作指针,或指针变量。
之前我们说变量的值可以被反复修改,也就是可以这样做:
int aint;
aint = -56; // 初始化赋值。
aint += 3;
aint ++
这种做法叫做变量赋值。有时候我们需要在定义变量的时候就为变量赋值,可以这样做:
double aflt = 3.14;
变量的第一次赋值被称作初始化。注意,如果一个变量没有经过初始化就被使用了,那是很危险的,尤其是没有初始化的指针变量。
通常,在定义一个变量的同时,我们就声明了他,但是这个变量通常只在当前源文件中可见,而一个软件项目会包含很多源文件。如果我们想在另一个源文件中使用这个变量,就需要声明他。例如,在 a.c 这个源文件中定义和初始化变量
/**
* @file: a.c
*/
short ashort=16;
然后我们在 b.c 文件中声明并使用他
/**
* @file: b.c
*/
extern short ashort;
ashort++;
2.1.7 符号常量
有时候我们希望用一个符号来代替某个字面常量,这看起来很像一个不允许改变值的变量,我们用 const 关键字来修饰它,使之成为符号常量。例如:
const long cnvar0=666;
const char cnvar1='C';
一个符号常量只能在定义时被初始化,并且不能够被再次赋值。例如下面做法是错的:
const int cnint = 256;
cnint++;
2.1.8 运算符
c语言运算符主要包括赋值运算、算数运算、逻辑运算、位运算、比较运算等。运算符主要涉及到优先级,结合性y以及前加加和后加加的问题。例如:
int val=5, mask=0b0100;
printf("val=%d.\n", val++); // val=5.
printf("val=%d.\n", ++val); // val=7.
if(val<=10 && val>=5)
{
printf("True\n");
}
val &= mask; // val=4.
2.1.9 宏
通过使用宏,可以指导c编译器做一些特别的工作。例如使用define关键字来做一些替代的工作:
#define BASE_ADDR (0x25)
#define REG1_OFFSET (0x01)
#define REG2_OFFSET (0x02)
printf("Register 1 addr=0x%x.\n", BASE_ADDR+REG1_OFFSET);
printf("Register 2 addr=0x%x.\n", BASE_ADDR+REG2_OFFSET);
这称作宏替换。宏替换可以提高程序的可移植性,例如上述例子中,只要修改 #define BASE_ADDR (0x25) 一处便可以修改所有寄存器的地址。
2.1.10 指针
指针变量的长度与总线位宽有关,如32位机则指针变量长度为4,64位机为8。