首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

2.8.1  面试题选

本小节的例子均为知名公司在招聘时使用过的试题。本章内容是C语言的基础部分,单独命题较少,命题时会增加综合题,以测试程序员对基本知识的理解程序,如例2-11、例2-12所示。

例2-11

#include<stdio.h>

int main()

{

    int a,b,c,d;

    a=10;

    b=a++;

    c=++a;

    d=10*a++;

    printf("b,c,d:%d,%d,%d",b,c,d);

}

程序说明。

本程序首先定义了4个整型变量,然后把10赋给变量a。

b = a ++相当于b = a;a = a + 1,因此,该条语句结束后,b的值为10,a的值为11。而“c = ++ a”相当于“a = a + 1”;“c = a”,该条语句运行结束后a的值变为12,c的值也为12。

对于“d = 10*a ++”,这条语句中有3个运算符:=、*和++,乘号运算符*的优先级最高,所以*运算先进行。++运算符只针对变量,因此这条语句相当于“d = 10*(a++);”而不是“d=(10*a)++”。“d=10*(a++)”又相当于“d = 10*a;a = a+1”,所以变量d的值为120,a的值为13。

例2-12  用两种方法实现交换两个变量的值。

方法一:使用一个中间变量。

int a=1,b=2,temp;

temp=a;

a=b;

b=temp;

程序说明

首先把变量a的值1暂存到变量temp中,temp变量的值为1。

然后把变量b的值2赋给变量a,此时变量a和b的值都为2。

最后把变量temp的值1赋给变量b,此时变量b的值为1,从而实现了两个变量的值交换。

方法二:不借助于任何中间变量。

int a=1,b=2;

a=a+b;

b=a-b;

a=a-b;

程序首先把a + b的值赋给a,此时a的值变为a + b即3,b的值不变,仍为2。

语句b = a − b运行之后,b的值为3 − 2即1,a的值不变仍为3。

语句a = a − b运行之后,a的值为3 − 1即2,b的值不变仍为1。此时变量a和b的值已经实现了交换。

2.8.2  实例精讲

本小节精选了一些有助于进一步理解和掌握C语言的实例。

例2-13  下列变量名中哪些是合法的?

3a,π,c#,temp1,float,_var。

分析。3a以数字开头,不合法。对于标识符(变量是标识符的一种),只能由a~z、A~Z、数字以及下划线“_”组成,π和#都是非法字符,因此π和c#都不是合法的变量名。

float是C语言的关键字(或称为保留字)不能作为标识符,也就不能作为变量名,不合法。

只有temp1和_var是合法的变量名。

例2-14  下列哪个是合法字符常量?

"a",'\n','China',a。

分析。“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*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的地址,正确的应该是:

scanf("%d %d",&a,&b);

(2)数据输出的格式与数据类型不匹配,正确的应该是:

printf("%f",f);

(3)C语言中,变量应该遵守“先定义,后使用”的规则。变量x、y在没有定义的情况下直接使用是错误的,正确的应该是在引用x、y变量值的语句前加上定义语句:

int a,b;

(4)该程序在编译时,编译器虽然不会报告错误,但会发出警告,提示变量x和y没有赋值就直接使用了。如果执行程序,程序将输出一个混乱的值。正确的应该是在打印语句前加上类似于下面的语句:

x=10,y=20;

(5)char型值的范围是−128~127,即使是unsiged char,它的范围也仅仅是0~255,300显然已经超出了变量所能存储的值的范围。正确的应该是赋给变量c一个合理的值。

(6)严格地说,这两条语句并没有错误。在使用scanf函数时,建议不要包含‘\n’。如果一定要这么使用,则在输入变量a的值时,应该按两次<Enter>键,因为字符‘\n’的作用相当于<Enter>键。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论