首页 理论教育C语言基本语法详解

C语言基本语法详解

【摘要】:指针是C语言区别于其他同时代高级语言的主要特征之一。4)字符串C语言的字符串其实就是char型数组,所以使用字符串并不需要引用库。表达式3为循环控制变量修改表达式,它使for循环趋向结束。for循环语句是C语言中功能最为强大的语句,甚至在一定程度上可以代替其他的循环语句。

1.数据类型

算法处理的对象是数据,而数据是以某种特定的形式存在的,C语言的数据类型包括整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型等。

1)常量与变量

常量其值不可改变,符号常量名通常用大写。

变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,且第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元

2)数组

如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组,它们以ASCII的NULL作为数组的结束。需要特别注意的是,方括内的索引值是从0算起的。

3)指针

如果一个变量声明时在前面使用∗号,表明这是个指针型变量。换句话说,该变量存储一个地址,而∗(此处特指单目运算符∗,下同。C语言中另有双目运算符∗)则是取内容操作符,意思是取这个内存地址里存储的内容。指针是C语言区别于其他同时代高级语言的主要特征之一。

指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值。

指针是一柄双刃剑,许多操作可以通过指针自然地表达,但是不正确或者过分地使用指针又会给程序带来大量潜在的错误。

4)字符串

C语言的字符串其实就是char型数组,所以使用字符串并不需要引用库。但是C标准库确实包含了一些用于对字符串进行操作的函数,使得它们看起来就像字符串而不是数组。使用这些函数需要引用头文件<string.h>。

2.数据类型关键字

基本数据类型关键字如下:

void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。

char:字符类型数据,属于整型数据的一种。

int:整型数据,表示范围通常为编译器指定的内存字节长。

float:单精度浮点型数据,属于浮点数据的一种。

double:双精度浮点型数据,属于浮点数据的一种。

类型修饰关键字如下:

short:修饰int,短整型数据,可省略被修饰的int。

long:修饰int,长整型数据,可省略被修饰的int。

signed:修饰整型数据,有符号数据类型。

unsigned:修饰整型数据,无符号数据类型。

复杂类型关键字如下:

struct:结构体声明。

union:共用体声明。

enum:枚举声明。

typedef:声明类型别名。

sizeof:得到特定类型或特定类型变量的大小。

存储级别关键字如下:

auto:指定为自动变量,由编译器自动分配及释放,通常在栈上分配。

static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。

register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参数,建议编译器通过寄存器而不是堆栈传递参数。

extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)。

volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值。

3.流程控制关键字

跳转结构如下:

return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。

continue:结束当前循环,开始下一轮循环。

break:跳出当前循环或switch结构。

goto:无条件跳转语句。

分支结构如下:

if:条件语句,后面不需要放分号。

else:条件语句否定分支(与if连用)。

switch:开关语句(多重分支语句)。

case:开关语句中的分支标记,与switch连用。

default:开关语句中的“其他”分支,可选。

for循环如下:

for循环结构是C语言中最具有特色的循环语句,使用最为灵活方便,它的一般形式为

for(表达式1;表达式2;表达式3)循环体语句->

表达式1为初值表达式,用于在循环开始前为循环变量赋初值。

表达式2为循环控制逻辑表达式,它控制循环执行的条件,决定循环的次数。

表达式3为循环控制变量修改表达式,它使for循环趋向结束。

循环控制语句是在循环控制条件成立的情况下被反复执行的语句。但是在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次,也可能一次也不计算。循环体可能多次执行,也可能一次都不执行。

for循环语句是C语言中功能最为强大的语句,甚至在一定程度上可以代替其他的循环语句。

do循环结构:

do 1 while⑵;的执行顺序是1->2->1…循环,2为循环条件。

while循环结构,while⑴2;的执行顺序是1->2->1…循环,1为循环条件。

以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。

4.语法结构

1)顺序结构

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句即可,它的执行顺序是自上而下,依次执行。

例如,a=3,b=5,现交换a,b的值,这个问题就好像交换两个杯子中的水,这就要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c=a;a=b;b=c;执行结果是a=5,b=c=3。如果改变其顺序,写成:a=b;c=a;b=c;则执行结果就变成a=b=c=5,不能达到预期的目的。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三步曲的程序就是顺序结构,如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s=3.141 59×r×r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其他结构一起构成一个复杂的程序,如分支结构中的复合语句、循环结构中的循环体等。

2)选择结构

顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程图写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。

3)循环结构

循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即go to循环、while循环、do while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用go to循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。

特别要注意在循环体内应包含趋于结束的语句(循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。

顺序结构、选择结构和循环结构并不彼此孤立的,在循环中可以有选择、顺序结构,选择中也可以有循环、顺序结构,其实不管哪种结构,均可广义地把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。

5.模块化程序结构

C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,即C程序=主函数+子函数。

6.C语言中的运算符号

C语言中的运算符号及说明如表7-1所示。

表7-1 C语言中的运算符号及说明

续表

比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补0)位移。例如,将11100011右移3比特,算术右移后成为11111100,逻辑右移则为00011100。因算术比特右移较适于处理带负号整数,所以几乎所有的编译器都是算术比特右移。

运算符的优先级从高到低大致是单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。

7.程序结构

一个C语言源程序可以由一个或多个源文件组成;每个源文件可由一个或多个函数组成;一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数;源程序中可以有预处理命令(包括include命令,ifdef、ifndef命令,define命令),预处理命令通常应放在源文件或源程序的最前面;每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号;标识符、关键字之间必须至少加一个空格以示间隔,若已有明显的间隔符,也可不再加空格来间隔。

8.书写规则

一个说明或一个语句占一行;用{}括起来的部分,通常表示了程序的某一层次结构,{}一般与该结构语句的第一个字母对齐,并单独占一行;低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写,以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。