数据类型、运算符与表达式
一 、 C语言的标识符和关键字
标识符:
标识符使用来标识程序中的某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、常量、数组等。
因为,C语言对大小写字符敏感,所以在编写程序时要注意大小写字符的区分。例如:对于sec和SEC这两个标识符来说,C语言会认为这是两个完全不同的标识符。
另外,C语言程序中的标识符命名应做到简洁明了、含义清晰。这样便于程序的阅读和维护。例如在比较最大值时,最好使用max来定义该标识符。
关键字 :
在c语言编程中,为了定义变量、表达语句功能和对一些文件进行预处理,还必须用到一些具有特殊意义的字符,这就是关键字。
关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符。 C语言中关键字主要有以下二类:
数据类型:char,double,enum,float,int,long,short,struct,union,unsigned,void,signed,volatile,auto,extern,register,static,const
语句 :if,return,break,case,continue,default,do,else,for,goto,switch,while标识符和关键字的区别
关键字就是C语言中已经被赋予特定意义的一些单词.不可以把这类词作为名字来用.(类似在中国,现实生活中的“社会主义”已经被赋予特定意义,不能用于产品、公司或人的名字)
标识符就是用给”变量、函数和文件”等起的名字.简单地说,标识符就是一个名字.
二 、 变量
变量是内存中的一块区域,在程序运行过程中可以修改这块区域中存放的数值。变量由两个要素构成:变量的名称和变量的类型。变量的名称是这个内存区域的唯一标识。变量的类型决定了这个内存区域的的大小、对所存储数值的类型要求。在程序中,有三种与变量有关的语句:变量的定义、变量的赋值和变量的引用。
变量的定义
如下的语句定义了一个变量:
int number;
这里‘number’是变量名,‘int’代表该变量是整数类型的变量,‘;’表示定义语句结束。
在目前流行的机器配置下,整型变量一般占4个字节的内存空间。变量的名字是由编写程序的人确定的,它一般是一个单词或用下划线连接起来的一个词组,说明变量的用途。在C/C++语言中变量名是满足如下规定的一个符号序列:1) 由字母、数字或(和)下划线组成;2) 第一个符号为字母或下划线。需要指出的是,同一个字母的大写和小写是两个不同的符号。所以,team和TEAM是两个不同的变量名。
定义变量时,也可以给它指定一个初始值。例如:
int numberOfStudents = 80;
对于没有指定初始值的变量,它里面的内容可能是任意一个数值。
变量一定要先定义,然后才能使用。
变量的赋值
给变量指定一个新值的过程称为变量的赋值,通过赋值语句完成。例如:
number = 36 ;
表示把36写入变量number中。下面是一段代码,试着分析代码”定义时的变量的值;每次赋值后,变量的值“
int temp; int count; temp = 15; count = temp; count = count +1; temp = count;
变量的引用
变量的引用既变量的使用,变量里存储的数据可以参与表达式的运算,或赋值给其它变量。这一过程称为变量的引用。例如下面是变量 total 的定义和使用:
int total = 0 ; int p1 = 5000 ; int p2 = 300 ; int p3 = 1000 ; int p4 = 1000 ; total = p1 + p2 + p3 + p4;其中,最后一个赋值语句表示把变量‘p1’,‘p2’,‘p3’和‘p4’的值取出来相加,得到的和赋给变量‘total’。最后一句执行后,‘total’的值变为7300。
全局变量和局部变量
定义变量时,可以将变量写在一个函数内部,这样的变量叫局部变量;也可以将变量写在所有函数的外面,这样的变量叫全局变量。全局变量在所有函数中均可以使用,局部变量只能在定义它的函数内部使用。请看下面的程序:
上面的程序中,n1、n2是全局变量,所以在所有的函数中均能访问;n3是在函数Function1里定义的,在其他函数中不能访问,因此语句11会导致“变量没定义”的编译错误;语句22也是一样。1. int n1 = 5, n2 = 10; 2. void Function1() 3. { 4. int n3 =4; 5. n2 = 3; 6. } 7. void Function2() 8. { 9. int n4; 10. n1 = 4; 11. n3 = 5; //编译出错 12.} 13.int main() 14.{ 15. int n5; 16. int n2; 17.if( n1 == 5 ) { 18. int n6; 19. n6 = 8; 20.} 21. n1 = 6; 22. n4 = 1; //编译出错 23. n6 = 9; //编译出错 24. n2 = 7; 25. return 0; 26.}
一个局部变量起作用的范围(称为“作用域”),就是从定义该变量的语句开始,到包含该变量定义语句的第一个右大括号为止,因此语句18定义的变量n6,其作用域就是从语句18开始直到语句20的位置。在语句23中试图访问n6,导致“变量没定义”的编译错误。
如果某局部变量和某个全局变量的名字一样,那么在该局部变量的作用域中,起作用的是局部变量,全局变量不起作用。例如语句16定义的局部变量n2和全局变量n2同名,那么语句24改变的就是局部变量n2的值,不会影响全局变量n2。
三、C语言的数据类型
前面我们介绍了变量的定义语句,就下来我们介绍几个常用的数据类型:
int nNumber;
此处的“int”表示了变量 nNumber 的“数据类型”,它说明nNumber是一个“整型变量”,即nNumber中存放的是一个整数。“数据类型”能够说明一个变量表示什么样的数据(整数,浮点数,还是字符等)。不同数据类型的变量,占用的存储空间大小不同。除了“int”以外,C语言中还有其他一些基本数据类型,现列举其中几个如下:
int: 整型。 int型变量表示一个整数,其范围是 -32768~32767(范围的意思是:int型变量仅能存储-32768~32767之间的整数,超过了就会出错)。
long int:长整型。和 int 类型一样也表示一个整数, 其存储容量比int要大很多,其范围是-231~231,占用4个字节的内存。
unsigned int: 无符号整型。unsigned int 类型的变量表示一个非负整数,占用4个字节,能表示的数的范围是:0~65535
unsigned long :和unsigned int一样。
上面几种类型统称为“整数类型”。float :单精度浮点型。float类型的变量表示一个浮点数(实数,如3.14、23.90),占用4个字节。
double :双精度浮点型。double类型的变量也表示一个浮点数,但它占用8个字节,因而精度比float类型高。
上面两类型统称为“浮点类型”。char : 字符型。char类型的变量表示一个字符,如’a’,’0’等。占用1个字节。字符型变量存放的实际上是字符的Ascii码。比如’a’的Ascii码是97,即16进制的0x61,那么如果有:
char c = ‘a’;
四、算术运算符
算术运算符用于数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余数(%)、自增(++)、自减(--)共七种。
求余数的运算符“%”也称为模运算符。它是双目运算符,两个操作数都是整数类型的。a % b 的值就是a除以b的余数。
除法运算符
C的除法运算符有一些特殊之处,即如果a、b是两个整数类型的变量或者常量,那么a/b的值是a除以b的商。比如,表达式 “5/2”的值是2,而不是2.5。请看下面的程序片断:1. int main() 2. { 3. int a = 10; 4. int b = 3; 5. double d = a/b; 6. printf("%f\n", d); 7. d = 5/2; 8. printf("%f\n", d); 9. d = 5/2.0; 10. printf("%f\n", d); 11. d = (double)a/b; 12. printf("%f\n", d); 13. return 0; 14. }上面程序的输出结果是:
3.000000
2.000000
2.500000
3.333333
语句5中,由于a、b都是整型,所以表达式a/b 的值也是整型,其值是3,因此d的值就变成3.0。 语句7和语句5类似,执行后d的值变为2.0。
语句9中,要求5除以2的精确值,为此要将5或者2表示成浮点数。除法运算中,如果有一个操作数是浮点数,那么结果就也会是较为精确的浮点数。因此表达式5/2.0 的值是2.5。
语句11求 a除以b的较为精确的小数形式的值。“(double)”的是一个“强制类型转换运算符”,它是一个单目运算符,能将其右边的操作数强制转换成double 类型。用此运算符先将a的值转换成一个浮点数值,然后再除以b,此时算出来的结果就是较为精确的浮点型的了。
自增自减运算符
自增运算符“++” 用于将整型或浮点型变量的值加1。只有一个操作数,是单目运算符。它有两种用法:
用法1:
变量名 ++;
用法 2:
++变量名;
这两种用法都能使得变量的值加1,但它们是有区别的,请看例子:
1. #include <stdio.h> 2. main() 3. { 4. int n1 , n2 = 5; 5. n2 ++; 6. ++ n2; 7. n1 = n2 ++; 8. n1 = ++ n2; 9. }语句5 执行后,n2的值是6;
语句6执行后,n2的值是7;
语句7执行过程,是先将n2的值赋给n1,然后再增加n2的值,因此语句7执行后,n1的值是7,n2的值是8。也可以说,表达式“n2++”的值,就是n2加1以前的值;
语句8 的执行过程,先将n2的值加1,然后再将n2的新值赋给n1。因此语句8执行后,n1的值是9,n2的值也是9。也可以说,表达式“++n2”的值,就是n2加1以后的值;
语句7和8体现了“++”写在变量前面和后面所造成的不同。
自减运算符“--” 用于将整型或浮点型变量的值减1。它的用法和“++”相同,不再赘述。
赋值运算符
赋值运算符用于对变量进行赋值,分为简单赋值(=)、复合算术赋值(+=, -=, *=, /=, %=)和复合位运算赋值(&=, |=, ^=, >>=, <<=)三类共十一种。
表达式“a = b”的值就是a,类型和a的类型一样。因此,可以写:
int a, b;
a = b = 5;
上面这条语句先将b的值赋为5;然后求得b=5这个表达式的值5,再赋值给a。
a += b 等效于 a = a + b,但是前者执行速度比后者快。
-=、*=、/=、%= 的用法和 += 类似。
关系运算符
关系运算符用于数值的大小比较。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。他们都是双目运算符。
关系运算符运算的结果是整型,值只有两种:0或非0。0代表关系不成立,非0代表关系成立。
比如表达式“3>5”,其值就是0,代表该关系成不成立,即运算结果为假;表达式“3==3”,其值就是非0,代表该关系成立,即运算结果为真。至于这个非0值到底是多少,C/C++语言没有规定,我们编程的时候也不需要关心这一点。C/C++语言中,总是用0代表“假”,用非0代表“真”,在后面的 2.7 节会看到其用法。
请看下面的例子:
main() { int n1 = 4, n2 = 5, n3; n3 = n1 > n2; // n3 的值变为 0 n3 = n1 < n2; // n3 的值变为某非0值 n3 = n1 == 4; // n3 的值变为某非 0 值 n3 = n1 != 4; // n3 的值变为0 n3 = n1 == 5; // n3 的值变为0 }
逻辑运算符
逻辑运算符用于数值的逻辑操作。包括与(&&)、或(||)、非(!)三种。前二者是双目运算符,第三个是单目运算符。其运算规则如下:
与(&&)
当且仅当表达式exp1和表达式exp2的值都为真(非0)时,“exp1 && exp2” 的值为真,其他情况,“exp1 && exp2”的值均为假。
例如,如果 n = 4,那么“n > 4 && n < 5 ”的值就是假,“n >= 2 && n < 5”的值就是真。或(||)
当且仅当表达式exp1和表达式exp2的值都为假(就是0)时,“exp1 || exp2” 的值为假,其他情况,“exp1 || exp2”的值均为真。例如,如果 n = 4,那么“n > 4 || n < 5 ”的值就是真,“n <= 2 || n > 5”的值就是假。非(!)
如果表达式exp的值为真,那么“ ! exp”的值就是假;如果exp的值为假,那么“ ! exp”的值就是真。比如,表达式“! (4 < 5 )”的值就是假。
函数
到目前为止,“函数”这个词已出现过好几次了,如main()、printf()、函数体等。下面将深入研究函数是什么,为什么它们那么重要。
大多数编程语言(包含C语言)都提供了一种方法,将程序切割成多个代码段(或子功能),各段都可以独立编写。在C语言中,这些段称为函数。一个函数的程序代码相对独立的,外界通过参数(也叫接口)将信息传给函数进行处理,函数处理的的结果传回外界。使用函数的过程叫做函数调用,请看例子:
printf(“%d\n”, 10)); // 函数调用
printf是个函数,它的功能输出字符或数字到电脑屏幕;
“%d\n”和“10”都是参数,是外界传给函数printf的信息。
标准输入输出库函数
C语言有一类库函数,称之为标准输入输出函数,可以用来从键盘读取键入的字符,以及将字符在屏幕上输出。这些函数的声明都包含在头文件 stdio.h中。我们介绍以下两个主要的标准输入输出函数:
printf函数(标准输出函数)
printf函数的作用是将一个或多个字符按照程序员指定的格式输出到屏幕上。printf函数调用的一般形式为:
printf(“格式控制字符串”,输出项1,输出项2…)
其中格式控制字符串用于指定输出格式,是用一对双引号括起来的。例如:
printf( “x = %d” , 50);
上面这条语句中,格式控制字符串就是“x = %d”,待输出项就是 50。其输出结果是:
x = 50
象”%d”这样由一个“%”和其后一个(或多个)字符组成的字符串,称为“格式控制符”。它说明待输出项的类型、输出形式(比如以十进制还是二进制输出,小数点后面保留几位等等)。“%d”表示其对应的待输出项是整型。
“%”和特定的一些字符组合在一起,构成“格式控制符”。常见的格式控制符有:
%d 要输出一个整数
%c 要输出一个字符
%s 要输出一个字符串
%x 要输出一个十六进制整数
%u 要输出一个无符号整数(正整数)
%f 要输出一个浮点数。
“格式控制字符串”中, “格式控制符”的个数应该和待输出项的个数相等,并且类型须一一对应。“格式控制字符串”中非格式控制符的部分,则原样输出。例如:
printf(“Name is %s, Age = %d, weight = %f kg, 性别:%c, code = %x” ,
“Tom”, 32, 71.5, ‘M’, 32 );输出结果是:
Name is Tom, Age = 32, weight = 71.500000 kg, 性别:M, code = 20
最后的待输出项“32” 对应的输出结果是“20”。因为它对应的输出控制符是“%x”,这就导致十进制数“32”被以十六进制的形式输出为“20”。
如果就是想输出“%d”这样一个字符串,怎么办呢?做法是,想输出一个“%”,就要连写两个“%”。例如:
printf(“a%%d”);
输出结果是:
a%d如果想让输出换行,则需输出一个换行符 “\n”。如:
printf(“What’s up?\nGreat!\nLet’s go!”);
输出结果是:
What’s up?
Great!
Let’s go!
scanf函数(标准输入函数)
scanf函数的一般形式为:
scanf(“格式控制字符串”,变量地址1, 变量地址2……);
scanf函数的作用是从键盘接受输入,并将输入数据存放到变量中。“变量地址”的表示方法是在变量前面加”&”字符。“格式控制字符串”说明要输入的内容有几项、以及这几项分别是什么类型的。函数执行完后,输入内容的每一项分别被存放到各个变量中。例如:
#include <stdio.h> main() { char c; int n; scanf("%c%d",&c, &n); printf("%c,%d", c, n); }scanf语句中的“%c%d”说明待输入的数据有两项,第一项是一个字符,第二项是一个整数。这两项之间可以用空格或换行进行分隔,也可以不分隔。scanf函数会等待用户从键盘敲入数据,用户输完后必须再敲回车,scanf函数才能继续执行,将两项输入数据存放到变量c和n中。上面的程序,不论敲入“t456回车”,还是“t空格456回车”还是“t回车456回车”,结果都是一样的。输出结果为:
t,456
即字符’t’被读入,存放在变量c中,”456”被读入,存放于变量n中。
如果要输入的是两个整数,那么这两个整数输入的时候必须用空格或回车分隔。
下面的程序,提示用户输入矩形的高和宽,然后输出其面积。
#include <stdio.h> main() { int nHeight, nWidth; printf("Please enter the height:\n"); scanf("%d",& nHeight); printf("Please enter the width:\n"); scanf( "%d",& nWidth); printf("The area is: %d", nHeight * nWidth); }