C语言学习(二)
C语言概述
一、C语言的历史
1、C语言是丹尼尔·里奇(Dennis Ritch)在贝尔实验室为开发UNIX操作系统而设计的。1972年,C语言首次在DEC PDP-11计算机被实现。
2、C语言是丹尼尔·里奇在B语言(肯·汤姆逊(Ken Thompson)发明)的基础上改造设计的。
3、1978年,布莱恩·柯林汉(Brian Kernighan)和丹尼尔·里奇 合著的The C Programming Language 是公认的C标准,通常被称为K&R C或经典C
4、第一个C语言标准 ANSI/ISO C标准由美国国家标准协会(ANSI,American National Standard Institute)制定,通常叫作C89或C90
5、1994年,ANSI/ISO联合委员会开始修订C标准,最终发布了C99标准。标准委员会于2011年发布了C11标准。
二、关于C
1、使用C语言编程的7个步骤
(1)定义程序的目标
(2)设计程序
(3)编写代码
(4)编译
(5)运行程序
(6)测试和调试程序
(7)维护和修改程序
2、源代码文件:用编程语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件。文件名以 .c 结尾,点号前面的部分称为基本名(basename),后面的部分称为扩展名(extension)。
文件名形式: 基本名.扩展名
三、简单的C程序示例
/*从键盘任意输入两位整数进行求和*/
#include<stdio.h>
int Add(int a,int b)
{
return a+b; //从函数返回整型数a与b之和
}
int main(void) //主函数
{
int x,y,sum = 0; //变量定义和初始化
printf("Input two integers:"); //在屏幕上显示一条提示信息
scanf("%d%d",&x,&y); //输入两个整型数x和y
sum = Add(x,y); //调用函数Add计算x和y之和
printf("sum = %d\n",sum); //输出x和y之和
return 0;
}
运行程序输入4和5,输出9 。
1、预处理器指令
#include<stdio.h>是预处理器指令,告诉C编译器在编译之前要包含stdio.h(标准输入/输出)头文件(header),该头文件包含了供编译器使用的输入和输出函数(如scanf()和printf()函数)信息。
2、函数
函数是C程序的基本单位(模块),即C程序是由函数构成的
(1)一个标准C程序必须有且仅有一个用main命名的函数,这个函数称为主函数。C程序一定从main()函数开始执行,而与它在程序中的位置无关。
(2)根据需要,一个C程序可以包含零到多个用户自定义函数,如Add()函数。
(3)在函数中可以调用系统提供的库函数,在调用之前只要将相应的头文件通过编译预处理命令包含到本文件中即可。
(4)函数由函数首部和函数体两部分组成。函数首部包括对函数返回值类型、函数名、参数类型、参数名的说明。函数体由函数首部下面最外层的一对花括号中的内容组成,包含变量定义语句(声明语句)和执行语句序列。
(5)花括号作用:所有C函数都使用花括号标记函数体的开始和结束,不能省略。花括号还可以用于把函数中的多条语句合并为一个单元或块。
3、语句
(1)除复合语句外,C语句都以分号作为结束标志。
(2)C程序的书写格式比较*,既允许在一行内写多条语句,也允许将一条语句分写在多行上,而 不必加任何标识。为提高程序的可读性和可测试性,建议一行内只写一条语句。
(3)C语言的6种语句:标号语句、复合语句、表达式语句、选择语句、迭代语句、跳转语句
4、注释
(1)在程序中被/* */两个符号括起来的部分是程序的注释,/*和*/之间的内容都会被编译器忽略。写注释时应注意右斜线 / 和星号 * 之间不能留有空格,适用于单行或多行注释。
(2)使用//符号创建注释,仅限于单行。一行中//符号后面的内容都会被处理为注释
四、提高程序可读性的技巧
1、选择有意义的函数名和变量名
2、写注释
3、在函数中用空行分隔概念上的多个部分
4、每条语句各占一行
#iinclude<stdioi.h>
int mian(void) /*把2英寻(测水深的单位)转换成英尺 ----(写注释)*/
{
int feet,fathoms; //----(使用有意义的变量名)
// ----使用空行
fathoms = 2;
feet = 6 * fathoms; //----每行一条语句
printf("There are %d feet in %d fathoms!\n",feet,fathoms);
return 0;
}
五、C程序常见符号分类
1、关键字(Keyword)
关键字又称保留字,是C语言中预先规定的具有固定含义的一些单词。用户只能按预先规定好的含义来使用它们,不能擅自改变其含义。
auto | break | case | char | const |
continue | default | do | double | else |
enum | extern | float | for | goto |
if | int | long | register | return |
short | signed | sizeof | static | struct |
switch | typedef | union | unsigned | void |
volatile | while |
C99新增关键字:inline、restrict、_Bool、_Complex、_Imaginary。
C11新增关键字:_Generic
2、标识符(Identifier)
(1)标识符分为系统预定义标识符和用户自定义标识符。
(2)系统预定义标识符的含义是由系统预先定义好的,如主函数名main、库函数名scanf等。与关键字不同:系统预定义标识符允许用户赋予新的含义,但会失去原有的预先定义的含义,从而造成误解,因而此做法不提倡。
(3)用户自定义标识符是由用户根据需要自行定义的标识符,通常用作函数名、变量名等。
(4)标识符命名规则:由英文字母、数字和下划线组成,且必须以英文字母或下划线开头;不允许使用关键字作为标识符的名字,同时标识符名也不应该与库函数名重名;标识符区分大小写。
3、运算符(Operator)
C语言提供了丰富的运算符,共34种。按不同的用途可大致分为13类:
算术运算符 | + - * / % |
关系运算符 | > >= == < <= != |
逻辑 | ! && || |
赋值运算符 复合的赋值运算符 |
= += -= *= /= %= &= |= ∧= <<= >>= |
增1和减1运算符 | ++ -- |
条件运算符 | ? : |
强制类型转换运算符 | (类型名) |
指针和地址运算符 | * & |
计算字节数运算符 | sizeof |
下标运算符 | [ ] |
结构体成员运算符 | -> . |
位运算符 | << >> | ∧ & ~ |
逗号运算符 | , |
1、算术运算符 :
用算术运算符将操作数连接起来的式子,称为算术表达式。其中,操作数可以是常量、变量或函数。
2、关系运算符:
用关系运算符将操作数连接起来组成的表达式,称为关系表达式。关系表达式通常用于表达一个判断条件的真与假。
3、逻辑运算符:
用逻辑运算符连接操作数组成的表达式,称为逻辑表达式。逻辑表达式的值(或称逻辑运算的结果)只有真和假两个值,C标准规定,用1表示真,用0表示假。
4、赋值运算符:
(1)由赋值运算符及相应操作数连组成的表达式,称为赋值表达式。其一般形式为:
变量名 = 表达式;
C语言还允许下列赋值形式(多重赋值表达式):
变量1 = 变量2 = 变量3 = ··· = 变量n = 表达式;
其等价于:变量1 = (变量2 = (变量3 = (··· = (变量n = 表达式)···)));
(2)由于变量名只能出现在赋值运算符的左边,故被称为左值lvalue(left value);由于常量名只能出现在赋值运算符的右边,故被称为右值rvalue(right value)
(3)复合的赋值运算符,其一般形式为:
变量 二元运算符= 表达式;
它等价于:变量 = 变量 二元运算符 表达式;
如:n *= m + 2 ;
运算规则:①先将“=”右侧表达式用括号括起来,即n *= (m+2)。
②再将“=”左侧的内容“n”移到“=”右侧,即n *(m+2)。
③最后在“=”左侧补上目标变量名,即n = n *(m+2)。
5、增1和减1运算符:
(1)增1运算符++和减1运算符--,既可以作为前缀运算符(用在变量前面),也可以作为后缀运算符(用在变量后面)。如:
语句 | 与左边语句等价的语句 |
++x; | x = x + 1; |
x++; | x = x + 1; |
--x; | x = x - 1; |
x--; | x = x - 1; |
(2)在表达式中,用作前缀运算符时,表示先将运算对象的值增1(或减1),然后使用该运算对象的值;在表达式中,用作后缀运算符时,表示先使用该运算对象的值,再将运算对象的值增1(或减1)。如,假设int型变量n的值为3,此时执行下列语句:
语句 | 与左边语句等价的语句 | 执行该语句后m的值 | 执行该语句后n的值 |
m = n++; |
m = n; n = n + 1; |
3 | 4 |
m = n--; |
m = n; n = n-1; |
3 | 2 |
m = ++n; |
n = n + 1; m = n; |
4 | 4 |
m = --n; |
n = n-1; m = n; |
2 | 2 |
后缀++和后缀--的优先级高于前缀++、前缀--及其他单目运算符。
6、类型强制转换运算符:
使用强制转换运算符,可以把表达式的结果硬性转换为一个用户指定的类型值。形式如下:
(类型)表达式
一般而言,将取值范围小的类型转换为取值范围大的类型是安全的,而反之是不安全的,可能会发生信息丢失、类型溢出等错误。
7、位运算符:
位运算是对字节或字内的二进制数位进行测试、抽取、设置或移位等操作操作对象不能是float和double等其他复杂的数据类型,只能是标准的char和int数据类型。
8、逗号运算符:
逗号运算符可将多个表达式连接在一起,构成逗号表达式,其作用是实现对各个表达式的顺序求值,因此也称为顺序求值运算符。其形式:
表达式1,表达式2,···,表达式n;
9、计算字节数运算符:
sizeof以字节为单位给出指定类型的大小。使用sizeof运算符获得变量或数据类型占用内存空间的字节数,能保证程序良好的可移植性。
sizeof运算对象是类型时,圆括号必不可少,但对于特定量,可有可无。如:sizeof(char);sizeof 变量 或sizeof 6.28等于sizeof(6.28)。建议所有情况下都使用圆括号()。
C运算符的优先级与结合性
4、分隔符(Separator)
在C程序中,空格、回车/换行、逗号等,在各自不同的运用场合起着分隔符的作用。例如:在程序相邻的关键字、标识符之间应由空格或回车/换行作为分隔符,逗号则用于相邻同类项之间的分隔(如,在定义相同类型的变量之间可用逗号分隔,在向屏幕输出的变量列表中,各变量或表达式之间也用逗号分隔。)
int a,b,c;
printf("%d%d%d\n",a,b,c);
5、其他符号
一些具有特定含义的符号。如,花括号{}、/* */ 、//等等。
6、数据
程序处理的数据有变量和常量两种基本数据形式。
参考书籍:
C Primer Plus(第6版)中文版
C语言大学实用教程(第4版)
下一篇: C语言学习(二)