一、对C语言的初步认识
二、C语言基本数据类型、操作符和表达式
三、C语言顺序结构程序设计
四、C语言选择结构程序设计
五、C语言循环结构程序设计
六、C语言位运算
七、C语言数组与字符串
八、C语言指针
九、C语言中的函数
十、C语言中数据和存储类型
十一、C语言中的用户定义数据类型
十二、C语言中编译预处理命令
一、数据类型
算法处理的对象是数据,而数据是以某种特定的形式存在(例如整数、实数、字符等形式)。
C语言提供如下数据类型:
1、常量和变量
-
在程序运行过程中,其值不能被改变的量称为常量。
-
常量一般从字母形式即可判别。这种常量称为字面常量或直接常量。
-
直接常量的类型主要有5种:①整形常量;②实型常量;③字符常量;④字符串常量;⑤符号常量;
-
变量:代表内存中具有特定属性的一个存储单元,它用来存放数据,也就是变量的值,在程序运行期间,这些值可以改变。
-
一个变量应该有一个名字,方便被引用。
标识符:在C语言中,用来表示变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符(identifier)。简单地说,标识符就是一个名字。
标识符命名:只能由字母、数字、下划线组成,并且第一个字符必须是字母或者下划线。
在C语言中,字母大小写敏感。因此在命名时需注意字符的大小写。
标识符长度(字符个数)规定:不同的编译器有不同的规定。ANSI C规定长度不超过32个字符。
- 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋值给一个变量。
- 例如:a=3;
作用是执行一次赋值操作(或称赋值运算)。
把常量3赋给变量a。 - 也可以将一个表达式的值赋给一个变量。
b=3*5+4;//b的值为19
二、整形数据
(1)十进制表示:
如:123、-456
(2)八进制表示:以数字0开头的数。
如:0123 即十进制的83
-011 表示八进制的-11,即十进制的-9
(3)十六进制表示,以0x开头的数。
如:0x123 即十进制的291
-0x12 即十进制的-18
数据在内存中的存放形式:
- 整形数据在内存中以二进制形式存放,占两个字节。
- 如:
int i;
i = 10;
- 长整形常量:占四个字节。
例子:
main()
{
printf("%d %x %o\n",125,125,125);
printf("%d %x %o\n",045,045,045);
printf("%d %x %o\n",0x32,0x32,0x32);
}
执行结果:
整形变量的分类
- 有4类整形变量
1)基本整形:int
2)短整形:short int 或者 short
3)长整形:long int 或者 long
4)8位整形:char - C语言没有具体规定以上各类数据所占内存的字节数,只要long不小于int型,short型不长于int型
- 一般在机器中:
-int占2byte;
-short占2byte;
-long占4byte;
-char占1byte;
整形变量的符号属性
- 变量有正负,常见的有8种整形变量:
整数存储空间和值的范围
整形变量 - 一个无符号的整形变量可以存放的正数的范围比一般整形变量中正数的范围扩大一倍。
整形变量定义与使用
#include<stdio.h>
int main() //Cpp1.cpp
{
int a;
int c;
int d;
int b;
unsigned int u;
a=12;
b=-24;
u=10;
c=a+u;
d=b+u;
printf("a+u=%d,b+u=%d\n",c,d);
return 1;
}
整形数据的溢出
#include<stdio.h>
int main() //Cpp2.cpp
{
short a;
short b;
a=32767;
b=a+1;
printf("%d,%d",a,b);
return 0;
}
- 整形数据到达最大值后,又从最小值开始计算。
整形常量的类型 - 使用整形常量时,需要注意:
(1)把整形常量赋给整形变量时,整形常量不能超过整形变量的取值范围。
如:char num = 192;
(2)一个整形常量后面加一个字母u或者U,则认为是无符号整型,如12345U在内存中按unsigned int
规定的方式存放(最高位不作符号位)。
(3)在一个整形常量后面加一个字母l或者L,则认为是long int
型。
三、实型数据
1、实型常量有两种表示方法:
(1):十进制表示:由数字和小数点组成。
例如:0.123 123450.0
(2):指数形式:
例如:123e3或者123E3都代表123×103
- 注意字母e(或E)之前必须有数字,且e后面的指数必须为整数。
例如:e3、2.1e3.5、. e3、e等都不是合法的指数形式。 - 规范化的指数形式:在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。
例如:1.23456e2 或 1.23456E2 - 浮点数即平时所说的实数,实数分为常量和变量。
- 实型变量分为3类:
(1)单精度(float型)
(2)双精度(double型)
(3)长双精度型(long double) - 实型变量的取值范围
浮点型数据在内存中的存放形式
- 在常用的微机系统中,一个实型数据在内存中占4个字节(32位)。与整形数据的方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。
- 不少C编译器(编译系统)以24位表示小数部分(包括符号,则数据表示只有23位,相当于223=8388480,有效数字只有7位),以8位表示指数部分(包括指数的符号,则数据表示只有7位,相当于27=128)。
- 小数部分占的位(bit)数越多,数的有效数字越多,精度越高。
- 指数部分占的位数越多,则能表示的数值范围越大。
浮点型数据的舍入误差
- 由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。
- 假如a已指定为单精度实型变量:
float a;
a = 111111.111;
/* 由于float型变量最多只能接收7位有效数字,因此最后两位小数不起作用。 */
- 应当避免将一个很大的数和一个很小的数直接相加减,否则会“丢失”小的数。
- 例如:
int main() //Cpp3.cpp
{ float a;
float b;
a = 123456.789e5; //实际数据位:123456789000
b = a + 20; //加了小的数,得b=123456789020
//浮点数只能保留7位,则丢失加的小数
printf("%f",b);
return 0;
}
/* 运行后输出:12345678868 //说明红的数是不正确的 */
浮点型常量的处理
- C编译系统将实型常量作为双精度来处理。
- 例如已定义一个实型变量f,有如下语句:
float f = 2.45678 * 4523.65
- 系统将2.45678和4523.65按双精度数据存储(占64位)和运输,得到一个双精度的乘积,然后取前7位赋给实型变量f。
- 如果在数的后面加字母 f 或 f (如1.65f,654.87f),这样编译系统就会按单精度(32位处理)。
- 一个实型常量可以赋给一个float型、double型或long double变量。根据变量的类型截取实型常量中相应的有效位数字。
四、字符型数据与字符串
1、字符型常量
-
C的字符常量是用单引号(即撇号)括起来的一个字符。
-
C的字符常量分为两类:
(1)普通字符常量——按ASCII码保存在一个字节中例如:'a','x','d','?','$'等都是字符常量。 注意区分大小写。‘a’和‘A’是不同的字符常量。 一个字符常量只能有一个字符。例如‘12’不正确。
(2)转义字符——以反斜杠字符“\”开头的字符序列。
2、字符型变量
- 字符型变量用来存放字符常量。
- 用“char”来说明是字符变量。
如:
char c1;
char c2;
c1='a';
c2='b';
- 在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。即字符型变量只能放一个字符。
字符数据在内存中的存储形式
- 将一个字符常量放到一个字符变量中,实际上并不是把字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单元中。
- 例如字符‘a’的ASCII代码位97,‘b’为98。如图:
字符数据的使用
- 一个字符数据既可以以字符形式输出,也可以以整数形式输出。
- 以字符形式输出时,需要先将存储单元中的ASCII代码转换成相应字符,再输出。
- 以整数形式输出时,直接将ASCII码作为整数输出。
- 也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算。
- 字符数据和整形数据是通用的,只是需注意,字符数据只占一个字节。
例子:
#include<studio.h>
int main()
{
char c1;
char c2;
c1=97;
c2=98;
printf("%c %c\n,c1,c2"); //以字符形式输出
printf("%d %d\n",c1,c2); //以整数形式输出
return 0;
}
/* 输出结果是: */
a b
97 98
例子:
int main()
{
char c1='a';
char c2='b';
c1=c1-32;
c2=c2-32;
printf("%c %c",c1,c2);
return 0;
}
/* 运行结果为: */
A B
- 字符数据说明:有些系统(如turbo c)将字符变量中的最高位作为符号位,也就是将字符处理成带符号的整数,即signed char型。它的取值范围是-128 ~ 127。如果输出一个128 ~255间的数,将是一个负数。
char c=130;
printf("%d",c);
输出结果为:-126
3、字符串常量
- 字符串常量是一对双引号括起来的字符序列。
- 如:
"how do you do."
"CHINA"
"a"
“123.45”
- 输出一个字符串:
printf(“how do you do.”);
字符串常量中注意的问题
- C语言规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。C规定以字符“\0”(ASCII码为0的字符,空操作符)作为字符串结束标志。
- ‘a’与“a”的区别:
‘a’:表示一个字符,在内存中占一个字节的空间。
“a”:表示一个字符串,在内存中两个字节的空间。
符号常量表示方法
- 符号常量:用#define定义的表示符称为符号常量,即以标识符形式出现在程序中的常量。
例如:#define PRICE 30
- 符号常量与变量的区别:
- 符号常量的值在其作用域内不能被改变,也不能被赋值
- 例如:PRICE = 40 ; //错误
- 符号常量命名:习惯上用大写命名。
- 如果包含多个单纯,则单词之间用下划线“_”分隔
- 例如:#define BUF_LEN 256
- 使用符号常量的优点:
(1)含义清除。
(2)在需要改变一个常量时能做到“一改全改”。
例子:
#define PRICE 30 //符号常量定义
#include<stdio.h>
viod main()
{
int main();
int total;
num=10;
total=num*PRICE;
printf("total=%d\n",total);
}
五、变量说明与初始化
1、变量说明(定义)
- 规定:变量必须“先说明,后使用”。
- 变量说明(定义)的格式:
- 数据类型 变量名列表;
- 说明的原因:
(1)能保证程序中变量名使用正确性。
如:
int student;
stadent = 30; //编译器发现该错误。
(2)有确定的类型,编译器才能为其分配相应的存储单元。
如:
int a; 分配2个字节单元。
2、变量的初始化
- 变量的初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化是在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于有一个赋值语句。
- 例如:
int a = 3;
相当于: int a; //制定a为整形变量
a=3; //赋值语句,将3赋给a
- 注意:变量没有赋值之前,他的值是不确定的
例子:
int a = 3;
float f = 3.56;
char c = 'a';
- 一般建议在定义变量的时候就为变量赋初值,这样不容易出差。
六、运算符和表达式
-
C语言的运算符范围很宽,把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。
-
C运算符简介:
(1)算术运算符:(±*/%)
(2)关系运算符:(><==>=<=! =)
(3)逻辑运算符:(!&& ||)
(4)位运算符: (<< >> ` | ^&)
(5)赋值运算符 (=及其扩展赋值运算符)
(6)条件运算符 (?:)
(7)逗号运算符 (,)
(8)指针运算符 (*和&)
(9)求字节数运算符 (s i z e o f)
(10)强制类型转换运算符 ((类型))
(11)分量运算符 (. ->)
(12)下标运算符 ([ ])
(13)其他 (如函数调用运算符()) -
两个整数相除的结果为整数,舍去小数部分。如5/3为1。
-
如果除数或被除数中有一个为负值,则舍入的方向是不固定的。如-5/3为-1或者-2
-
多数C编译器采取“向零取整”的方法。如5/3=1,-5/3=1
-
用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称C算术表达式。
-
运算对象包括常量、变量、函数等。如a*b/c-1.5+‘a’
-
在算术运算符中除了“%”要求整数外,其余可以是任意数据类型。
算术运算符优先级与结合性
- 优先级:如先乘除后加减
- 结合性:如果优先级一样。则按结合顺序处理。不同运算符的结合顺序不同。
- 算术运算符的结合方向为:‘自左至右’
- 编程时,建议不要去记忆运算符的优先级,建议用最保险的方法——用圆括号确定顺序
- 例子:
int i = (a>=b)&&(c<d)&&((e+f)<=(g+h));
表达式
- 指有各种运算符把常量、变量、函数等运算对象连接起来的具有实际意义并符合C语法规则的式子。
- 表达式的类型:
(1)关系表达式:‘9’<‘3’
(2)逻辑表达式:a&&b
(3)赋值表达式:x = 100
(4)条件表达式:a>0?3:6
(5)逗号表达式:i = 3,j = 5,k = 10
(6)算术表达式:a = a + 3
数据类型的自动转换原则
- 整形、实型、字符型数据间可以混合运算。
- 例子:
10 + ‘a’ + 1.5 - 8765.1234 * 'b'
- 在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。
- 转换的规则是小数据类型转换成大数据类型。
强制类型转换运算符 - 一般形式为:(类型名)(表达式)
- 如
(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
(float)(5%3) (将5%3的值转换成float型)
int main()
{
float x;
int i;
x = 3.6;
i = (int)x;
printf("x=%f,i=%d",x,i);
return 0;
}
运行结果为:x = 3.600000,i = 3