C语言程序设计基础知识——谭浩强版

1.一个程序应包括:

  • 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构。
  • 对操作的描述。即操作步骤,算法。
  • 程序=算法+数据结构

2.C源程序的结构特点

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

3.C源程序的基本格式

例:
main()
{
printf(“Hello world!\n”);
}

  • main是主函数的函数名,表示这是一个主函数。
  • 每一个C源程序都必须有,且只能有一个主函数(main函数)。
  • 函数调用语句,printf函数的功能是把要输出的内容送到显示器去显示。
  • printf函数是一个由系统定义的标准函数,可在程序中直接调用。

例:
#include<math.h>
#include<stdio.h>
main()
{
double x,s;
printf(“input number:\n”);
scanf("%lf",&x);
s=sin(x);
printf(“sine of %lf is %lf\n”,x,s);
}

  • include 称为文件包含命令
  • 扩展名为.h 的文件称为头文件
  • 定义两个实数变量,以被后面程序使用
  • 显示提示信息
  • 从键盘获得一个实数 x
  • 求 x 的正弦,并把它赋给变量 s
  • 显示程序运算结果
  • main 函数结束

4.结构化程序设计

  • 自顶向下
  • 逐步细化
  • 模块化设计
  • 结构化编码

5.C语言的数据类型

  • 基本数据类型:整型、字符型、实型(浮点型——单精度型、双精度型)、枚举类型。
  • 构造数据类型:数组类型、结构体类型、共用体类型。
  • 指针类型:指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。
  • 空类型:在调用函数值时,通常应向调用者返回一个函数值。

6.整型常量

  • 整型常量就是整常数。通常有八进制、十六进制、十进制三种
  • 十进制整常数:十进制整常数没有前缀。其数码为 0~9。 如:233、-54。
  • 八进制整常数:八进制整常数必须以 0 开头,即以 0 作为八进制数的前缀。数码取值为 0~7。八进 制数通常是无符号数。如:015(十进制为 13)、0101(十进制为 65)、0177777(十进制为 65535)。
  • 十六进制整常数:十六进制整常数的前缀为 0X 或 0x。其数码取值为 09,AF 或 a~f。 如:0X2A(十进制为 42)、0XA0 (十进制为 160)、0XFFFF (十进制为 65535)。

7.整型变量

1)整型数据在内存中的存放形式

  • 正数的补码和原码相同
  • 负数的补码:将该数的绝对值的二进制形式按位取反再加 1


求-10 的补码:
10 的原码: 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
取反: 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 再加 1
得-10 的补码: 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0

2)整型变量的分类

  • 基本型:类型说明符为 int,在内存中占 2 个字节。
  • 短整量:类型说明符为 short int 或 short。所占字节和取值范围均与基本型相同。
  • 长整型:类型说明符为 long int 或 long,在内存中占 4 个字节
  • 无符号型:类型说明符为 unsigned。

3)整型变量的定义与使用
main()
{
long x,y;
int a,b,c,d;
x=5;
y=6;
a=7;
b=8;
c=x+a;
d=y+b;
printf(“c=x+a=%d,d=y+b=%d\n”,c,d);
}
从程序中可以看到:x, y 是长整型变量,a, b 是基本整型变量。它们之间允许进行运算,运算结果为长整型。但 c,d 被定义为基本整型,因此最后结果为基本整型。本例说明,不同类型的量可以参与运算并相互赋值。其中的类型转换是由编译系统自动完成的。

8.实型常量

  • 实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有两种形式: 十进制小数形式,指数形式。
  • 十进制数形式:由数码 0~ 9 和小数点组成。 如:0.0、-25.0、5.789、0.13。注意,必须有小数点。
  • 指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为: a E n(a 为十进制数,n 为十进制整数),其值为 a10n。 如:2.1E5 (等于 2.110^5)
  • 实型常数不分单、双精度,都按双精度 double 型处理。
  • 标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如 356f 和 356.是等价的。


main()
{
printf("%f\n “,356.);
printf(”%f\n “,356);
printf(”%f\n ",356f);
}

9.实型变量

  • 实型数据一般占 4 个字节(32 位)内存空间。按指数形式存储。
  • 小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。
  • 指数部分占的位数愈多,则能表示的数值范围愈大。
  • 实型变量分为:单精度(float 型)、双精度(double 型)和长双精度(long double 型)三类。
  • 由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。


main()
{
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("%f\n%f\n",a,b);
}
由于 a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之 后均为无效数字。 b 是双精度型,有效位为十六位。但 Turbo C 规定小数后最多保留六位,其余部分四舍五入。

10.字符常量

  • 字符常量是用单引号括起来的一个字符。 如: ‘a’、‘b’、’=’、’+’、’?’
  • 字符常量只能用单引号括起来,不能用双引号或其它括号。
  • 字符常量只能是单个字符,不能是字符串。
  • 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如’5’和 5 是不同 的。'5’是字符常量,不能参与运算。

11.字符变量

  • 字符变量用来存储字符常量,即单个字符。
  • 字符变量的类型说明符是 char。字符变量类型定义的格式和书写规则都与整型变量相同。如:char a,b;

12.转义字符

  • 转义字符是一种特殊的字符常量。转义字符以反斜线""开头,后跟一个或几个字符。转义字符具有特定 的含义,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题 printf 函数的格式串中用到的“\n” 就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
  • \n 回车换行
  • \t 横向跳到下一制表位置
  • \b 退格
  • \r 回车
  • \f 走纸换页
  • \ 反斜线符""
  • ’ 单引号符
  • \” 双引号符
  • \a 鸣铃
  • \ddd 1~3 位八进制数所代表的字符
  • \xhh 1~2 位十六进制数所代表的字符

13.字符串常量

  • 字符串常量是由一对双引号括起的字符序列。例如: “CHINA” , “C program” , “$12.5”
  • 字符串常量和字符常量是不同的量。它们之间主要有以下区别:
    1. 字符常量由单引号括起来,字符串常量由双引号括起来。
    1. 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
    1. 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中 没有相应的字符串变量。这是与 BASIC 语言不同的。但是可以用一个字符数组来存放一个字符串常量。在数组一章内予以介绍。
    1. 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加 1。增加的一 个字节中存放字符"\0" (ASCII 码为 0)。这是字符串结束的标志。 如:字符串 “C program” 在内存中所占的字节为: C p r o g r a m \0

14.变量赋初值

  • 在变量定义中赋初值的一般形式为:类型说明符 变量 1= 值 1,变量 2= 值 2,……


int a=3;
int b,c=5;
float x=3.2,y=3f,z=0.75;
char ch1=‘K’,ch2=‘P’;
应注意,在定义中不允许连续赋值,如 a=b=c=5 是不合法的。


main()
{
int a=3,b,c=5;
b=a+c;
printf(“a=%d,b=%d,c=%d\n”,a,b,c);
}

15.各类数值型数据之间的混合运算

  • 变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生 在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则:
    1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
    1. 转换按数据长度增加的方向进行,以保证精度不降低。如 int 型和 long 型运算时,先把 int 量转成 long 型后再进行运算。
    1. 所有的浮点运算都是以双精度进行的,即使仅含 float 单精度量运算的表达式,也要先转换成 double 型,再作运算。
  1. char 型和 short 型参与运算时,必须先转换成 int 型。
  2. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入 向前舍入。


main()
{
float PI=3.14159;
int s,r=5;
s=rrPI;
printf(“s=%d\n”,s);
}
本例程序中,PI 为实型;s,r 为整型。在执行 s=rrPI 语句时,r 和 PI 都转换成 double 型计算,结果也 为 double 型。但由于 s 为整型,故赋值结果仍为整型,舍去了小数部分。

  • 强制类型转换:通过类型转换运算来实现的。 其一般形式为: (类型说明符) (表达式) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 例如:(float) a:把 a 转换为实型; (int)(x+y):把 x+y 的结果转换为整型,在使用强制转换时应注意以下问题:
    1. 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y 则成了把 x 转换成 int 型之后再与 y 相加了。
    1. 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换, 而不改变数据说明时对该变量定义的类型。


main()
{
float f=5.75;
printf("(int)f=%d,f=%f\n",(int)f,f);
}
本例表明,f 虽强制转为 int 型,但只在运算中起作用,是临时的,而 f 本身的类型并不改变。因此,(int)f 的值为 5(删去了小数)而 f 的值仍为 5.75

算术运算符和算术表达式

  • C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右 进行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。

16.C运算符

  • 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减 (–)共七种。
  • 关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=) 六种。
  • 逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
  • 位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或 (|)、位非 (~)、位异或(^)、左移 (<<)、 右移(>>)六种。
  • 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值 (&=,|=,^=,>>=,<<=)三类共十一种。
  • 条件运算符:这是一个三目运算符,用于条件求值(??。
  • 逗号运算符:用于把若干表达式组合成一个表达式(,)。
  • 指针运算符:用于取内容(*)和取地址(&)二种运算。
  • 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
  • 特殊运算符:有括号(),下标[],成员(→,.)

基本的算术运算符

  • 加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算。如 a+b,4+8 等。具有右结合 性。
  • 减法运算符“-”:减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5 等具 有左结合性。
  • 乘法运算符“*”:双目运算,具有左结合性。
  • 除法运算符“/”:双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。


main()
{
printf("\n\n%d,%d\n",20/7,-20/7);
printf("%f,%f\n",20.0/7,-20.0/7);
}
本例中,20/7,-20/7 的结果均为整型,小数全部舍去。而 20.0/7 和-20.0/7 由于有实数参与运算,因此结果也为实型。

  • 求余运算符(模运算符)“%”:双目运算,具有左结合性。要求参与运算的量均为整型。 求余运算的结果等于两数相除后的余数。


main()
{
printf("%d\n",100%3);
}
本例输出 100 除以 3 所得的余数 1。

算术表达式
-用算术运算符和括号将运算对象(也称操作数)连接起来的、符合 C 语法规则的式子。 以下是算术表达式的例子:
a+b
(a*2)/c
(x+r)*8-(a+b)/7
++I
sin(x)+sin(y)
(++i)-(j++)+(k–)

运算符的优先级

  • C语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。

运算符的结合性

  • C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。 例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z 则 y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称 为“右结合性”。 最典型的右结合性运算符是赋值运算符。如 x=y=z,由于“=”的右结合性,应先执行 y=z 再执行 x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。

自增、自减运算符

  • 自增1,自减1运算符:自增 1 运算符记为“++”,其功能是使变量的值自增 1。
  • 自减 1 运算符记为“–”,其功能是使变量值自减 1。
  • 自增 1,自减 1 运算符均为单目运算,都具有右结合性。可有以下几种形式:
  • ++i i 自增 1 后再参与其它运算。
  • –i i 自减 1 后再参与其它运算。
  • i++ i 参与运算后,i 的值再自增 1。
  • i-- i 参与运算后,i 的值再自减 1。


main()
{
int i=8;
printf("%d\n",++i);
printf("%d\n",–i);
printf("%d\n",i++);
printf("%d\n",i–);
printf("%d\n",-i++);
printf("%d\n",-i–);
}
i 的初值为 8,第 2 行 i 加 1 后输出故为 9;第 3 行减 1 后输出故为 8;第 4 行输出 i 为 8 之后再加 1(为 9);第 5 行输出 i 为 9 之后再减 1(为 8) ;第 6 行输出-8 之后再加 1(为 9),第 7 行输出-9 之后再减 1(为 8)。

类型转换

  • 如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的 类型。具体规定如下:
    1. 实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。
    1. 整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为 0)。
    1. 字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的 ASCII 码值放到整型量 的低八位中,高八位为 0。整型赋予字符型,只把低八位赋予字符量。


main()
{
int a,b=322;
float x,y=8.88;
char c1=‘k’,c2;
a=y;
x=b;
a=c1;
c2=b;
printf("%d,%f,%d,%c",a,x,a,c2);
}
本例表明了上述赋值运算中类型转换的规则。a 为整型,赋予实型量 y 值 8.88 后只取整数 8。x 为实型, 赋予整型量 b 值 322, 后增加了小数部分。字符型量 c1 赋予 a 变为整型,整型量 b 赋予 c2 后取其低八位成 为字符型(b 的低八位为 01000010,即十进制 66,按 ASCII 码对应于字符 B)。

复合的赋值运算符

  • 在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。 构成复合赋值表达式的一般形式为:
  • 变量 双目运算符=表达式,它等效于 变量=变量 运算符 表达式
  • 例如: a+=5 等价于 a=a+5 ; x*=y+7 等价于 x=x*(y+7) ; r%=p 等价于 r=r%p 。

逗号运算符和逗号表达式

  • 其一般形式为: 表达式 1,表达式 2 其求值过程是分别求两个表达式的值,并以表达式 2 的值作为整个逗号表达式的值。


main()
{
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf(“y=%d,x=%d”,y,x);
}
本例中,y 等于整个逗号表达式的值,也就是表达式 2 的值,x 是第一个表达式的值。

  • 19
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值