C顺序程序设计
计算机高级语言
数据的表现形式
常量和变量
A :常量 (程序运行过程中,值不能改变的量;数值常量:数学中的常数) 1、整型常量 2、实型常量(俩种表示形式) 第一种:十进制小数形式,由数字和小数点组成(例:12.34) 第二种:指数形式(例:12.34e3表示12.34*10的3次方) 【注】程序无法表示下标E/e表示以10为底的指数;E/e前边是数字后边是整数(e4,12e2.5都是错误的) 3、字符常量 (1)普通字符:用单引号括起来的字符(例:'a','b','3','?') 【注】'ab','12'是不正确的。 单引号只是界定符,字符常量只能是一个字符,不包括单引号。 'a'和'A'是不同的变量(详见ASCLL代码) (2)转义字符:以字符”\“开头的字符序列。
'\n'换行符 '\t'水平制表符 '\v'垂直制表符 '\f'换页 '\b'退格 '\0'字符串结束标志 '\o'8进制 '\x'16进制 ...
4、字符串常量:双引号中的全部字符,不包括双引号。 从字面形式就直接可以识别的常量称为”字面常量“或”直接常量“。 5、符号常量
#define PI 3.1416//用PI替换3.1416,PI就是符号常量 //符号常量修改起来很方便,如果说想修改,只需要修改PI就可以,不需要像字面常量逐一修改 //符号常量是不占用内存空间的,只是一个临时的符号,注意和变量区别。
B: 变量
//定义一个变量 变量类型 变量名; //变量再定义的时候尽量赋值,不赋值不会报错,系统会默认的分配0。 //变量必须先定义再使用 int a = 10;//变量就是申请一个存储单元来存放变量的值,通过变量名来找到对应值的存储地址; //变量在程序运行过程中是会改变的,所以称为变量
C: 常变量
const int b=3;//变量加上const关键字称为常变量,具有变量的基本属性,有类型有空间,但是不能改变值。
常变量和符号常量区别
#define是预编译指令,预编译后符号常量就不存在了,不会分配内存空间; 而常变量是要占用内存空间的,只是值不改变而已。
D:标识符 对变量、符号常数、函数、数组、类型等命名的有效字符序列称为标识符 【注】标识符的名字可以包含字母、数字、下划线,但必须是以字母或下划线开头,不包含其他关键字的标识符才是合法的标识符;尽量的反应出其在程序中的作用和含义;避免不合法的标识符出现(¥asd,#abd,3d64,a>b都是不合法的)。
数据类型
def:类型是对数据分配的存储单元的安排,包括存储单元的长度和存储形式。
不同的类型在内存中占用的存储单元长度是不同的; A:整型
//int分配4byte,带符号整数用二进制补码形式存放 //5的二进制是101,它放在4byte内的形式为0000 0000 0000 0000 0000 0000 0000 0101 //求负数补码(1.数据的绝对值表示为二进制;2.最高位符号位为1,表示负数;3.除符号位外的数值取反加1) //例:-5的补码 //1.求5的二进制形式:0000 0000 0000 0000 0000 0000 0000 0101(5的补码); //2.最高位符号位为1:1000 0000 0000 0000 0000 0000 0000 0101(-5原码); //3.将除符号位进行取反:1111 1111 1111 1111 1111 1111 1111 1010; //4.最后再加1 :1111 1111 1111 1111 1111 1111 1111 1011(-5补码); //无符号整数 unsigned int a=10;//整型4byte unsigned short int b=10;//短整型2byte unsigned long int c=10;//长整型8byte //带符号整数 int a1 = -20; short int b1=10; long int c1=10; //定义整型变量需要注意: //(1)只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加; //(2)对无符号整型数据用“%u”格式输出;
B:字符与字符代码(程序只能识别系统字符集中的字符,对应ASCLL字符集)
//定义字符变量; char c='?';
C:浮点型数据(具有小数点的实数,以指数形式存放在存储单元中。一个实数可以有不止一种表现形式)
//类型: float f=0.1f;//单精度浮点型(4byte) //小数部分+指数部分(小数部分占用位多,精度高,指数部分占用位多,表示的范围大,能得到6位有效数据;float在实际运算中先转换位double再进行运算) double d=0.1;//双精度浮点型(8byte) //小数部分+指数部分(小数部分占用位多,精度高,指数部分占用位多,表示的范围大,能得到15位有效数据) long double = 3.141315926//长双精度浮点型(编译器不同分配的存储单元不同) //float型变量能存储的数值可以在3个范围内 //(1)-3.4*10^38~-1.2*10^-38; //(2)0; //(3)1.2*10^-38~3.4*10^38; //在定义时需要注意溢出错误和误差问题
D:常量类型(常量被存放在计算机存储单元中,整数在Visual C++中分配4个字节,按补码方式存储)
//字符常量('a') //数值常量(123为整型常量) //浮点型常量(以小数形式和指数形式出现的实数)
[注]类型是抽象的,没有存储空间,类型只是变量的一个属性。变量是具体存在的,变量有具体的存储空间
运算符
1、算术运算符
+ - * / % ++ --
2、关系运算符
< > == >= <= !=
3、逻辑运算符
! && ||
4、位运算符
>> << ~ | ^ &
5、赋值运算符
=及其扩展赋值运算符
6、条件运算符
? :
7、逗号运算符
,
8、指针运算符
* &
9、字节数运算符
sizeof
10、强制转换运算符
(类型)
11、成员运算符
. ->
12、下标运算符
[]
13、其他
如函数调用运算符()
-
基本的算数运算符
// (正号运算符)+ (负号运算符)- 都为单目运算符,需要一个操作数 +1 -1 // + - 加减为双目运算符,需要俩个操作数 1+2 a+b c-d //优先级:正负乘除取余加减,由高到低 //俩个实数相除的结果是双精度实数,俩个整数相除的结果是整数 // 5/3结果是1 // 3/5结果是0 //如果除数和被除数有一个为负数,则舍入的方向不固定。-5/3结果有的系统是-1有的是-2;多数的编译系统是采取“向0取整”的方法。 //% 为取余运算符 //% 要求参加运算的运算对象都为整数,结果也是整数 8 % 3 结果是2 //自增++ 自减-- 使变量+1或-1 //i++ i-- 在使用i之前,先使i的值加/减1 //++i --i 在使用i之后,使i的值加/减1
-
用算术运算符和括号将运算对象(操作数)连接起来的、符合C语法规则的式子,我们将之称为C算术表达式。运算对象包括常量、变量、函数等等 例如: a*b/c-1.5+'a' 为合法的运算符
优先级:先乘除后加减;表达式求值的时候,先按运算符的优先级别顺序执行。如果在一个运算对象俩侧的运算符的优先级相同,是采用左结合性(结合方向自左至右)。赋值运算符是右结合性的(结合方式自右向左)。
-
不同类型数据之间的混合运算
-
整型、实型、字符型数据之间可以进行混合运算; 规律:float int double 类型数据进行算术运算时,float int 会自动转化为double 类型;char 和 int 类型数据,char 会转化为ASCLL代码再和int进行数值运算。 【注】:同一个字母的小写比大写大32;a=97,A=65;
-
-
C中的类型转换分为自动类型转换和强制类型转换;
-
利用强制类型转换运算符将一个表达式转换成所需的类型
例:(double)a (int)(x+y) (float)(5%3) 说明:在强制类型转换时,得到一个所需类型的中间数据,原来的变量类型不变。
-
C语句
语句的作用:向计算机系统发出操作指令 -> 执行操作; C语句经过编译生成指令; 声明部分只是进行有关数据的声明;
-
控制语句(9个)
1、if (){} else(){}(条件语句) 2、for( ; ; ){}(循环语句) 3、while(){}(循环语句) 4、do{}whlie()(循环语句) 5、continue(结束本次循环语句) 6、break(中止执行switch或循环语句) 7、switch(多分支选择语句) 8、return(函数返回语句) 9、goto(转向语句,在结构化程序中基本不用goto语句)
-
函数调用语句
函数调用语句由一个函数调用加一个分号构成。 printf("this is c program \n");
-
表达式语句
一个表达式加一个分号构成; a=3 //赋值表达式 a=3;//赋值语句
-
空语句
就是只有一个分号的语句,可以用来作为流程的转向点,也可以用来作为循环语句中的循环体;
-
复合语句
用{}把语句和声明括起来成为复合语句;
-
赋值语句
赋值运算符 = 如果赋值运算符右边是包含若干项的的表达式,那么它相当于是有括号的 例:x%=y+3等价于x=x%(y+3) 赋值表达式是先计算后赋值。 赋值运算符左边的称为左值,左值是可以改变的。成为左值的条件是有存储空间,可以被赋值。因此变量是可以作为左值的,算术表达式、常量是不可以作为左值的。 赋值运算符左边的称为右值,凡是左值都可以作为右值。 赋值表达式中的“表达式”又可以是一个赋值表达式 赋值过程中的类型转换: 1、赋值运算符俩侧的类型一致,直接进行赋值; 2、将浮点型数据赋值给整型变量时,舍弃小数部分给变量赋值; 3、将整型数据赋给单精度或双精度变量时,数值不变,但以浮点数形式存到变量中; 4、一个double型数据赋给float变量时,先将双精度转化为单精度,只取6~7位有效数字,存储到float型变量的4个字节的存储空间中; 5、字符型数据赋值给整型变量时,将字符的ASCLL代码赋值给整型变量; 总结:整型数据之间的赋值是按照存储单元的存储形式直接传送的,实型数据之间以及整型与实型之间的赋值时先转换类型再赋值的; 【注】 一个表达式中可以包含多个表达式,但不可以包含赋值语句。 普通变量的初始化是程序运行期间执行到本函数中才进行初始化。 静态存储变量和外部变量的初始化是在编译阶段完成的;
C中输入输出
scanf("%lf%lf%lf",&a,&b,&c);//通过键盘给abc赋双精度的值,%lf为双精度的格式声明 printf("a=%7.2f\tb=%7.2f\tc=%7.2f",a,b,c);//%7.2f为数据占7列,小数占2列。 【注】 1、输入输出是以计算机主机为主体的; 2、C本身不提供输入输出语句,目的使C编译系统简单精练。输入输出是由c标准函数库中的函数实现,printf和scanf不是c语言的关键字,是库函数的名字;(语句翻译为二进制指令是在编译阶段进行的,没有输入输出语句可以避免处理与硬件有关的问题,从而使得编译系统通用性强,可移植性性好) 3、程序中使用标准的输入输出函数就需要在开头使用预处理指令导入头文件(#include<stdio.h>); #include用尖括号和双引号的区别 尖括号是从编译系统的子目录查找文件,双引号是从当前目录(源程序目录)开始,找不到再去编译系统的子目录查找。非系统提供的用双引号。
printf函数
//printf(格式控制,输出列表) printf("i=%d c=%c\n",i,c); //"i=%d c=%c\n"为格式控制 //%d%s为格式声明,将输出的数据换为指定的格式进行输出 //i= c= 为普通字符,按原样进行输出 //i,c为输出列表 //printf(参数1,参数2,参数3,参数4...);参数2-n是以参数1指定格式进行输出。参数1必须由参数2-n是可选的。 //格式字符 //%d:输出一个有符号的十进制整数 //%5d:指定域宽,输出数据占五列,显示在此域右侧 //%ld:输出一个长整型 //%c:输出一个字符 printf("%c",a); //%s:输出一个字符串 printf("%s\n","this is c program"); //%f:输出浮点数,只能输出6位小数 //%m.nf:指定数据宽度和小数位数(根据四舍五入,n指定为0后不输出小数位) //%-m.nf:输出一个数据向左对齐 printf("%7.2f\n",5/3); //%e:以指数形式输出实数 //%x:以十六进制数进行输出 //%o:以8进制数进行输出 //%u:输出无符号数,以十进制数进行输出 //%g:用来输出浮点数,系统自动选定f格式或是e格式 //[注] //1、printf函数输出时,必须注意输出对象和输出格式是否匹配 //2、除了X,E,G可以不区分大小写,其他格式必须用小写(%d不能写%D) //3、可以在printf函数中的格式控制字符串内包含转义字符(\t \n \b \r \f \377(8进制表示)) //4、输出%号 printf("%f%%",1.0/3);
scanf函数
//scanf(格式控制,地址表列) //控制格式与printf相同 //地址表列由若干的变量地址或是字符串的首地址组成 scanf("a=%d,b=%f,c=%c",&a,&b,&c); //使用时注意的问题 //1、scanf函数中的格式控制应当是变量的地址,不是变量名 //2、如果在格式控制字符串中除了格式声明意外还有其他字符,则在输入数据时在对应的位置输入相同的字符(在控制台键盘输入时,应输入:a=3,b=3.0,c=a) //3、在用“%c”格式声明输入字符时,空格字符和转义字符中的字符都作为有效字符输入。输入数值的时候需要插入空格或其他分隔符,连续输入字符时,在俩个字符之间不要插入空格或其他分隔符 //4、输入数值数据时,输入空格、回车、Tab或非法字符,认为该数据结束
字符输入输出函数
putchar()函数可以从计算机向显示器输出一个字符。
putchar(c);
getchar()函数,向计算机输入一个字符;
a=getchar();//从计算机键盘获取一个字符