C语言的发展最早可以追溯到1972年。他的创造是由于写Unix操作系统而需要,Unix操作系统最开始是由汇编语言写的,汇编语言的最大好处就是代码运行速度快。但是其缺点也是非常明显的,那就是代码出错的话调试难度大,最大问题是由于代码移植性差,不能跨平台,因为汇编语言的一些指令和平台强相关。这就很显然的降低了效率,并且阻碍了Unix的发展。于是后来有了B语言,但是B语言也有他的一些限制,并且随着Unix的大力发展,使得在B语言的基础上发展出来了C语言。让我们记住这样的一位伟人,C语言之父——丹尼斯·里奇 (Dennis Ritchie) 。
说完C语言简史之后我们接下来就会进行C语言的基础语法介绍了!
我们直接通过一个 Hello World 程序来引入我们的语法。hello world程序可以说是编程语言的一个约定俗称的事了。hello world翻译过来就是 你好世界,其实就是向世界打了一声招呼,告诉这个世界,我来了。其实写这个hello world 程序还有另一层含义就是只要这个程序能够正常运行就代表自己本地上的运行环境是没有问题的,所以当你学习任何编程语言的时候都可以尝试一下 hello world 这个程序哦!
源代码:
#include
int main()
{
printf("Hello World!\n");
return 0;
}
运行结果:
Hello World!
上面的代码其实很简单,就是向屏幕终端打印一句话 " hello world! " 。
下面我们来对其进行剖析:
(1)#include
(2)int main(){} : 这里就是定义了一个返回值为 int 型变量的 main函数,值得注意的是我们所有的C程序都是从main函数开始运行的,并且是到main运行完结束的。换句话说就是只要是C程序就必须要定义main函数。
(3)printf(“Hello World!\n”); :这句的作用就是向屏幕终端输出一个 hello world。printf()就是stdio.h里面的一个函数,关于他的作用我们在后面文章会有详细讲解。
(4)return 0; : 函数返回值,返回值的类型需要和函数最前面类型一致。
常量,顾名思义就是不变的量,像 1, 2, 3, 1.1, -100 等等这样这样的数都是常量,并且我们是不能够对常量进行赋值的。
变量,顾名思义就是变化的量,定义变量我们通常要对变量赋予数据类型,如 char a; int b; (定义字符型变量a, 定义整形变量b)。并且变量是可以进行赋值的。
在定义变量的时候,我们一般会对其赋予数据类型,接下来我们就会介绍C语言的数据类型。
基本数据类型:
char : 字符型。是 signed char 类型的简写,即有符号字符型,简称字符型。在内存中占一个字节,数值范围 -128~127。
unsigned char : 无符号字符型。在内存中占1个字节,数值范围 0~255。字符就是用单引号引起来的一个字符。需要注意的是,在单引号里面最多只能有一个字符。
short : 短整型。是 signed short 类型的简写,即有符号短整型,简称短整型。在内存中占2个字节,数值范围 -32768~32767。
unsigned short : 无符号短整型。在内存中占2个字节,数值范围 0~65535。
int : 整型。是 signed int 类型的简写,即有符号整型,简称整型。在内存中占4个字节(16位及以下操作系统中是2字节),数值范围 -2147483648~2147483647。
unsigned int : 无符号整型。在内存中占4个字节(16位及以下操作系统中是2字节),数值范围 0~4294967295。
long : 长整型。是 signed long 类型的简写,即有符号长整型,简称长整型。在内存中占4个字节(64位操作系统中是8字节)。
unsigned log: 无符号长整型。在内存中占4个字节(64位操作系统中是8字节)。
long long: 长长整形,在内存中占8个字节。
float : 单精度浮点型,在内存中占4字节。
double : 双精度浮点型,在内存中占8字节。
空类型:
void : 空类型,在内存中占1字节。
构造数据类型:
数组 : 如 char buf[10]; 可存放同类型的多个数据。
结构体 : struct,可存放不同类型的多个数据。
共用体 : union,可存放不同类型的多个数据,共用体中数据公用同一片地址空间。
指针类型:
* : 例如 char* int* 等,指针类型大小32位操作系统始终是4字节, 64位操作是8字节。
C语言的关键字一共有32个,这些关键字是已经定义好了的,我们不能随意改动,并且这些关键字都有其特殊意义。
void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
char :声明字符型变量或函数
short :声明短整型变量或函数
int : 声明整型变量或函数
long :声明长整型变量或函数
float :声明浮点型变量或函数
double :声明双精度变量或函数
enum :声明枚举类型
unsigned :声明无符号类型变量或函数
signed :声明有符号类型变量或函数
struct :声明结构体变量或函数
union :声明联合数据类型
const :声明只读变量
auto :声明自动变量 一般不使用
do:循环语句的循环体
while :循环语句的循环条件
for :一种循环语句
if:条件语句肯定分支
else :条件语句否定分支(与 if 连用)
switch :用于分支语句
case :开关语句分支
continue :结束当前循环,开始下一轮循环
break:跳出当前循环
default :开关语句中的“其他”分支
goto :无条件跳转语句
sizeof :计算数据类型长度
volatile :说明变量在程序执行中可被隐含地改变
static :声明静态变量
register:声明寄存器变量
typedef:用以给数据类型取别名
extern:声明变量是在其他文件正声明(也可以看做是引用变量)
return :程序返回语句
在我们定义变量名或函数名时,我们就会定义标识符,例如 int a; 这就是定义了一个 int 型的变量 a ,这个 a 就是一个标识符,同理,我们还可以定义 char b; float c; 这些变量就是标识符,变量的名字是我们自己取的,C语言对于标识符是有要求的:
(1)标识符只能由字母、数字、下划线组成。
(2)标识符只能由字母或下划线开头。
(3)标识符不能和C语言关键字冲突。
虽然C语言的标识符可以由我们自己命名,但是为了养成良好的编码习惯,还是建议大家在命名的时候能做到见名知意。不然要是代码容量庞大的话,可能都不知道自己取这个标识符是为了干啥。
如果一段代码添加了注释,那么程序在运行代码的时候,是不会运行注释里面的代码的,注释里面的内容会在程序运行时自动忽略。注释里面的内容通常是对代码做一些标注或解释,方便自己或他人来阅读代码。可以理解成,代码是写人计算机运行的,注释是写给人看的。
C语言添加注释的方法有三种。
(1)// 双斜线注释,是注释这一行中双斜线后面的内容。
(2)/* */ 这种注释方法是注释掉这两个符号之间的所有内容,如果注释多行可以用这种方法更快速。
(3)#if 0
这中间的内容会被注释
#else
这中间的内容会正常运行
#endif
第三种方法其实严格意义上来讲并不能算作注释,只是这种做法也能达到注释的目的。
在C语言中可识别到的进制数有八进制、十进制、十六进制。
八进制数需要数字 0 开头,如 012 是个八进制数,他的十进制为10
十进制数我们就非常熟悉了,如 10, 12等
十六进制数需要 0x 开头 , 如 0xa 是个十六进制数,他的十进制为 10
即 012, 10, 0xa 他们的数值都是相等的,只是进制不同。
C语言运算符有很多,根据操作数的不同,运算符可以分为单目运算符、双目运算符、三目运算符。如果使用某个运算符只需要一个操作数就能完成,我们就称这个运算符是单目运算符,其他以此类推。我们知道数学中四则运算有优先级的问题,同理。我们C语言中也有运算优先级。
c语言中所有的运算符和优先级的关系可以参照下图所示。
因为C语言中有些字符要赋予其特殊的含义,为了保证不和其本意冲突,故导入转义字符的概念。转义字符就是用 \ 将字符的原本意义进行改变,赋予其新的含义。
常见的转义字符有:
\n : 换行
\t : 水平制表符,相当于一个 Tab 键
\v : 垂直制表符
\f : 换页
\\ : 代表一个 \ 字符
\ddd : 1到3位八进制数所代表的任意字符,d代表的是任意八进制数
\xhh : 1到2位十六进制所代表的任意字符,h代表的是任意十六进制数
C语言的类型转换可以分为强制类型转换和隐形类型转换。
强制类型转换:
强制类型转换就是将某种类型强制转换成另一种类型。是我们人为强制做的转换。
隐式类型转换。
隐式类型转换也是将某种类型转换成另一种类型。这种转换是由编译器自动做的。
在做强制类型转换的时候,如果一个大类型转换成小类型是会有精度丢失的,这一点值得注意。
上面讲述了那么多关于C语言的语法,在这里将通过了一个完整的示例让大家对其进行进一步认识。
源代码:
#include
int main()
{
/* 定义变量 */
char a = 'x';
short b = 23;
int c = 10;
long d = 67;
float e = 3.14;
double f = 12.13;
printf("a = %c, b = %d, c = %d, d = %d, e = %f, f = %lf\n", a, b, c, d, e, f);
printf("%d, %d\n", a, 10); //变量可以随意赋值,常量不能。
printf("%d, %d, %d\n", 012, 10, 0xa); //将八进制、十进制、十六进制数都以十进制方式打印。
/*C语言除法运算符是获取商,取余运算符是获取余数*/
printf("%d %d %d\n", b+c, b/10, b%10);
/*八进制61就是十进制49,49对应的ASCII字符就是1*/
printf("\61, \x32\n");
printf("c = %d\n", (int)e); //将float类型强制转换成int类型输出
return 0;
}
运行结果:
a = x, b = 23, c = 10, d = 67, e = 3.140000, f = 12.130000
120, 10
10, 10, 10
33 2 3
1, 2
c = 3