2.8.2 实例精讲
本小节精选了一些有助于进一步理解和掌握C语言的实例。
例2-13 下列变量名中哪些是合法的?
3a,π,c#,temp1,float,_var。 |
分析。3a以数字开头,不合法。对于标识符(变量是标识符的一种),只能由a~z、A~Z、数字以及下划线"_"组成,π和#都是非法字符,因此π和c#都不是合法的变量名。
float是C语言的关键字(或称为保留字)不能作为标识符,也就不能作为变量名,不合法。
只有temp1和_var是合法的变量名。
例2-14 下列哪个是合法字符常量?
分析。"a"是字符串常量而不是字符常量。C语言规定,以""括起来的字符是字符串常量,字符串常量中的每一个字符都用一个字节来存储,并且系统自动在字符串的结尾添加一个特殊的字符'\0'以表示字符串的结束。而对于字符常量或变量,系统只用一个字节来存储。
'\n'是一个合法的字符常量,它是一个转义字符,用于回车换行。'\n'在系统并不是用一个字符来存储'\',再用一个字节来存储'n',而是把'\n'作为一个整体,存储它的ASCII码。
'China'既不是字符常量也不是字符串常量,"China"才是一个字符串常量。
a也不是字符常量,'a'才是字符常量。a可以是一个合法的变量名,它可以作为一个整型变量,字符变量或其他变量。
例2-15 若有以下定义。
char a='a';int b=10;float c=0.5;double d=1.25; |
则表达式a*b + c -d 的值是什么类型?
分析。在计算表达式a*b + c d 的值时,首先计算a*b,char型变量的值默认要转换为int型进行计算,而变量b是int型,所以a*b的值为int型。再计算a*b与c的和,由于float型的值默认要转换为double型进行计算,相应地a*b的值也要转换为double型后才参与运算,由于c是float型,所以a*b+c的结果还要转换回float型。最后计算a*b+c与d的差,a*b+c的值先转换为double型,再计算结果。由于d是double型,结果不会转换回float型,最后的结果为double型。这些转换都是由系统自动完成的,程序员并不需要参与。
例2-16 变量a的初始值为3,下面的语句执行之后,变量a的值是多少?
分析。赋值运算符"="是右结合性的,也就是从右往左进行计算。在"a + = a = a*a"中,"a = a*a"相当于"a = a (a*a)",而"a + = a = a*a"相当于"a = a +(a = a*a)",所以整个语句相当于"a = a +(a = a (a*a))"。在计算"a = a +(a = a (a*a))"时,首先计算"a (a*a)",值为 6,此时该语句为"a = a + ( a = 6)",即把 6赋予变量a后,计算"a = a + a",所以最后a的值为 12。熟练之后,不用进行如此变换,可立即得出结果 12,但在初学时,最好能一步一步分析清楚。
例2-17 下列赋值语句哪个是正确的?
A x=3,y=5 B a=b=c C i--; D y=int(x);
|
分析。A错误,C语言中,除了宏定义等少数语句,其他语句都以";"结束,A没有以";"结束。
B的错误与A一样。
C正确,该语句将i减1。
D错误,在进行强制类型转换时,应该是"y = (int)x"。"y = (int)x + y"、"y = (int)(x + y)"也都是正确的,前者对变量x进行类型转换,后者是对x与y的和进行类型转换。
例2-18 分析下面的程序段,指出错误。
(1)int a,b; scanf("%d %d",a,b); (2)float f=2.5; printf("%d",f); (3)main() { x=1; y=2; printf("x+y is %d\n",x+y); } (4)main() { int x, y; printf("x+y is %d\n",x+y); } (5)main() { char c=300; printf("c is %d\n",c); } (6)int a; scanf("%d\n",&a); |
分析。
(1)在scanf函数中,参数应该是变量a、b的地址,正确的应该是:
(2)数据输出的格式与数据类型不匹配,正确的应该是:
(3)C语言中,变量应该遵守"先定义,后使用"的规则。变量x、y在没有定义的情况下直接使用是错误的,正确的应该是在引用x、y变量值的语句前加上定义语句:
(4)该程序在编译时,编译器虽然不会报告错误,但会发出警告,提示变量x和y没有赋值就直接使用了。如果执行程序,程序将输出一个混乱的值。正确的应该是在打印语句前加上类似于下面的语句:
(5)char型值的范围是 128~127,即使是unsiged char,它的范围也仅仅是0~255,300显然已经超出了变量所能存储的值的范围。正确的应该是赋给变量c一个合理的值。
(6)严格地说,这两条语句并没有错误。在使用scanf函数时,建议不要包含'\n'。如果一定要这么使用,则在输入变量a的值时,应该按两次键,因为字符'\n'的作用相当于键。