目录
4.标识符:用来对变量,符号常量名,函数,数组类型等命名的有效字符序列
一、常量和变量
1.常量:程序运行中,其值不能被改变的量。
(1)整型常量 (123,-12)
(2)实型常量(1.十进制小数形式【123.2】; 2.指数形式【12.34e3】)
(3)字符常量(1.普通字符【用单引号,括起来的字符,只能是 ‘a’,不能是 ‘ab’】;
2.转义字符【以"\",开头的字符序列】)
(4)字符串常量(“abc”)
(5)符号常量(#define PI 3.14 ,注意末尾没有分号)
【注意】
1、e或E之前必须有数字,且e或E之后必须是整数(不能写e4,12e2.5)。
2、单引号只是界限符,字符常量只能是一个字符,不包括单引号。
3、'a' 和 'A'是不同的字符常量,字符常量存储时,不是存储字符,而是存它对应的ASCII码。
4.要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存,只是一个临时符号,代表一个值,在预编译后就不存在了,所以不能对其重新赋值。为了与变量名区别,符号常量一般大写表示(PI,PRINCE)
2.变量:一个有名字的,有特定属性的,一个存储单元
用来存放值,程序运行期间,变量的值可以改变。
【注意】变量必须先定义,后使用,注意区分变量名和变量值。
3.常变量:常变量是有名字的不变量
定义方式:在变量前,加上 const
4.标识符:用来对变量,符号常量名,函数,数组类型等命名的有效字符序列
C语言规定,标识符只能由字母、数字、下划线组成,且第一个字符必须为字母或下划线。
【注意】编译系统认为,大小写的字母是不同的字符。
二、数据类型
1.基本类型
(1)整数类型
(2)浮点类型
2.空类型(void)
3.枚举类型(enum)
4.派生类型
(1)指针类型(*)
(2)数组类型( [ ] )
(3)结构体类型( struct )
(4)共用体类型( union )
(5)函数类型
【注意】
1.int(shortint),字符 型:用整数的补码形式存放到存储单元,存放整数的存储单元当中,最左边的一位是符号位(0是正,1是负)
2.只有整形数据(包含字符型)数据可以加signed和unsigned修饰符,实形数据不能加。
3.字符类型也属于整形,因为会被替换成ASCII码表示。
4.在使用有符号字符型变量时,允许存储的值为-128~127,但是字符的代码不可能为负数,所以在存储字符时的实际上只用到0~127这一部分,其第一位都是0。
5.系统在存放浮点型数据时,将实型数据分为小数部分和指数部分分别存储,小数部分小数点前面的数为0。
6.凡是以小数形式或指数形式出现的实数均是浮点型常量,在内存当中以指数形式存储,C编译系统把浮点型常量都按双精度处理。
7. f/F:表示float类型 ;l/L:表示long double类型。
三、运算符和表达式
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
1.运算符
++i:i值先加一,再运算 i--:i值先运算,再减一
2.优先级
3.不同类型间的混合运算
1. int 与 float/double ,int -> float/double,结果为double。
2.float 与 double,float -> double,结果为double。
3.字符型和整型,字符型 -> ASCII ,结果为int。
4.字符型和浮点型,字符型 -> ASCII -> double,结果为double。
4.强制类型转换运算符
形如:(转换类型)(表达式)
例子:(double)a;(int)(x+y);
【注意】:在强制类型转换时,所得到的只是一个所需的中间数据(临时的数据,使用之后就不存在了),而原本的变量的类型没有发生变化。例如 a =(int)x;x是float类型,那么得到一个int类型的临时值,赋给a,x依然是float类型。
四、C语句
由前面看到,函数包含一个声明部分和执行部分,执行部分是由语句组成,语句的作用是向计算机系统发出操作指令,要求执行相应的操作。一个C语句经过编译后产生若干条机器指令。声明部分只是对有关部分的声明,它不产生机器指令。
C程序结构如下图
1.C语句分为五类
1.控制语句(9个)
- if() ... else ... (可写成:if(x>y)z=x;else z=y;)
- for() ...
- while() ...
- do ...while() ...
- continue
- break
- switch
- return
- goto (转向语句,在结构化程序当中基本不用)
2.函数调用语句
由一个函数调用加一个分号构成,例如:printf(" This is C statement. ");
3.表达式语句
由一个表达式加一个分号构成,例如:a=3 是一个赋值表达式,而 a=3;才是一个赋值语句。
4.空语句
例如:
;
此语句就一个分号,那么他的作用是什么呢?
可作为流程的转向点(流程从程序的其他地方转到此处),也可以做循环体(表示循环体啥也不用做)。
5.复合语句
可以用 { } 把一些语句和声明括起来成为复合语句(又称语句块),例如:
{
int a = 1;
b = a;
printf("b=%d",b);
}
6.最基本的语句——赋值语句
在C程序当中,最常用的就是赋值语句和输入输出语句,可以自己试一试写出求三角形的面积。
【注意】:凡是在程序当中要用到数学库中的函数,都要在本文件开头包含 math.h 头文件。
2.归纳一下,赋值相关的问题
1.赋值运算符
“ = ”就是赋值运算符,例如:a = 3;就是把常量3赋值给变量a;同理表达式的值也可以赋给变量。
2.复合的赋值运算符(※)
在“ = ”之前加上其他的运算符,例如“ += ”,如:a += 3 等价于 a = a +3;
【注意】:如果运算符右边部分是一个表达式,那么默认他是一个带括号的整体,在处理不同优先级的时候,需要特别注意!!!
3.赋值表达式
将一个变量和表达式连接起来的式子,称为”赋值表达式“ 。如:变量 赋值运算符 表达式
例如:a = 3 * 5;c这个赋值表达式,顾名思义包含两种作用,一,计算表达式的值;二,把值赋给变量
赋值运算符左侧的值,应该是一个可以修改的值,称为”左值( left value , 简写 lvalue )”,很显然并不是任何值都可以出现在左边,左值应当为存储空间并可以被赋值,变量可以是左值,而表达式就不行,常量也不行。同理,右值就是赋值运算符右边的值,凡是左值,都可以出现在右值的位置。例如:a = (b=2);
4.赋值过程当中的类型转换(※)
两边类型一致,就直接赋值,不一致,就需要按照系统规则进行类型转化。转换规则是:
(1)浮点类型(d/f)赋给整型变量时,先对浮点数取整,然后赋给整型变量,如 “i = 3.14;”执行后就是使 i 的值为3,以整数形式存储到变量当中。
(2)整型赋给浮点类型(d/f),数值不变,但是以浮点数形式存储到变量,如有 float 类型的 f 变量,执行“f = 22;”,那么 f的值就是 22.0 。
(3)将 double 类型赋值给 float 类型时,先将双精度转为单精度,即智取6~7为有效数字,存储到 float 类型的 4 字节变量当中。反之,把 float 类型赋值给 double 类型时,数值不变,在内存当中以 8 字节存储,有效位拓展到了 15 位。
【注意】双精度的大小不能超过 float 类型变量的数值范围,如:“double d = 3.14e100;f = d;”出现了指数的100次方,float无法容纳这么大的数,会出现错误。
(4)字符型赋值给整型时,就是 ASCII 码赋给整型变量。 如:“int i = 'A';”, i 的值为65。
(5)将占字节多的整型数据赋给占字节少的整型数据或字符变量时,如:把 4 字节的 int ,赋值给 2 字节的 short 或 1字节的 char ,只将其低字节原封不动的送到被赋值的变量(发生 “截断 ”)
如下图举例所示
总结:
看起来很多很复杂的规则,其实就两个要点,(1)整型之间的赋值,按照存储单元当中的存储形式对应起来直接传送即可 (2)实型数据之间 以及 整型与实型 之间的赋值,都是先转换类型,后赋值。
5.赋值表达式和赋值语句区别
赋值表达式的末尾没有分号,赋值语句末尾必须有分号。在一个表达式当中可以包含一个或多个赋值表达式,但是绝不能包含赋值语句。如:if((a = b > 0))max = a;是对的,但是如:if((a = b;)> 0 )max = a;这样是错的!其中 a = b;就是赋值语句。
6.变量赋予初值
由之前语句可以看出,可以用赋值语句对变量赋值,也可定义变量时,对他赋予初值。
一般变量初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化是在编译时完成的),而是在程序运行时执行本函数时赋予初值的。
【特别注意!】“int a,b,c = 5” ,此语句声明了三个整型变量a,b,c;但是只对 c 赋值 5 。
对几个变量同时赋值应该写成:“ int a = 3,int b = 3,int c = 3;”,不能写成“int a = b = c = 3 ”。
五、数据的输入输出
1.输入输出注意事项
(1)用 scanf 函数输入 a 的值,请注意在 scanf 括号内的变量 a 前面,加上地址符 & ,&a 表示变量 a 在内存当中的地址。
(2)在 scanf 函数当中,把格式声明为“ %lf %lf %lf”,连续的三个 %lf 。要求输入三个双精度实数,输入的数据每两个之间用空格分隔。(系统会先把输入的三个数转换为双精度类型,然后赋值给变量)。
(3)在 printf 函数当中,在格式符前面加上“ 7.2 ”,如printf(“ x = %7.2f ”,x),就表示输出时指定数据占7列,小数占2列。这样做的好处是:1.根据实际的需要来输出小数;2.输出时按照小数点对齐,使得数据呈现美观。
2.有关输入输出的概念
在讨论程序的输入输出时要注意以下几点:
(1)输入输出是以计算机主机为主体而言。
(2)C语言本身不提供输入输出语句(由C标准函数库当中的函数实现)。
(3)要在程序文件的开头,用预处理指令 #include ,把有关的头文件放在本程序中(就是包含stdio.h)。
【注意】#include 还有一种形式,就是不用尖括号,使用双撇号,如 #include " stdio.h "。这两种形式的区别是:
< stdio.h >:编译系统从存放C编译系统的子目录去寻找需要包含的文件,称为标准方式
" stdio.h " :系统在编译时,编译系统先在用户的当前目录(一般是用户存放源程序文件的子目录)中寻找要包含的文件,若找不到,再按照标准方式进行查找。
3.用 printf 函数输出数据
1. 一般格式为:printf(格式控制,输出列表);如下图所示
格式声明总是由 % 开始,由 % 和 格式字符 组成(%d,%f)。
2. 格式字符
- d 用来输出一个有符号的十进制整数。如:%5d( 5 代表域宽,即所占列数为 5 )。
- c 用来输出一个字符。只有 1 字节大小,超出部分也只取 1 字节长度。
- s 用来输出一个字符串。
- f 用来输出实数(单/双精度、长双精度)。以小数形式输出。%f:整数部分全输出,小数只包含 6 位数。%7.2f:指定整数 7 位,小数 2 位,小数超出部分四舍五入。%- m.nf:添加了负号,也和没加相同,只是数据长度不超过 m 时,数据向左靠齐,有段补上0。
- i 和 d 的功能一样,习惯用 d 。
- o 以 8 进制整数输出。不带符号,符号位也一起作为 8进制输出。
- x/X 以 16 进制整数输出。
- u 输出十进制无符号整型数据。
- g/G 输出浮点数,系统自动从 f / d / e 格式选择输出,其中会自己选择长度较短的格式。
- e/E 用格式声明“ %e ” 指定以 指数形式 输出实数。不指定域宽的话,许多编译系统会给出数字部分的小数为 6 位,指数为 5 列(如:e+002,共占5列。)数值按标准化输出,即小数点前面只有一位非 0 数字。同样的也可以使用 %m.n 来指定域宽。(例如:printf(“%e”,123.456);输出1.234560e+002)。
还有一些附加函数如图
说明:
(1)printf 函数输出时,对象的类型 和 格式 必须匹配,否则报错。
(2)除了X、G、E 外。其它的只能小写。
(3)如果想输出 % 字符,示例:printf("%f%%\n",1.0/3);输出0.333333%。
4.用 scanf 函数输入数据
一般形式:scanf(格式控制,地址列表);例如scanf(“a = %d”,&a);
注意事项:
(1)格式控制后面的地址列表,注意一定不能忘了 & 。
(2)格式控制当中除了格式声明还有其他字符也需要在输入时写入,以上述例子,那么应该输入a = 1;直接写 1 时是不对的。
(3)如果格式控制当中有多个以逗号分割,那么输入也要以逗号分隔
(4)如果格式控制当中多个格式无间隔,那么输入的时候也不能有符合,也不能要空格。
(5)在输入数值数据时,如遇到非法字符(不属于数值),则认为程序结束。例如:scanf("%d%c%f",&a,&b,&c);如果输入1234a123o.26,那么a=1234;b=a;c=123。
5.字符输入输出函数
除了 printf 和 scanf 函数外,C库函数还提供了一些专门用于输入输出字符的函数。
(1)putchar输出函数。一般形式为putchar(a) ,如果a = 'Q',那么结果就是 Q。如果 a 是数字,那么就是输出对应的ASCII字符,但是注意整型数据的范围是0~127。
(2)getchar输入函数。它没有参数,一次只能接受一个字符
说明:在输入多个字符的时候,并不是输入了就送到计算机当中去了,而是存在键盘的缓冲器当中,等按下Enter之后一起送进去。