C语言考试笔答题部分坑点解析

1.下面程序中的加注释方式是合法的:

#include <stdio.h>

void main()

{ int x/*x初始化*/=0;

  /*打印*/printf("%d",x);

}

这种就不合法:

#incl/*   */ude <stdio.h>

这样也不合法:

#include <st/*x初始化*/dio.h>

2.

int a=12;

printf("%d",a+=a-=a*=a);

输出结果是0

等号表达式从左往右计算。上式等价于((12+12-24*0

3.

以下数组定义不正确的是:

int a[3][]={(1,2), {0,0}};

这里的知识点是,数组的行数可以省,列数不能省。

对于二维数组,如果不用大括号括起来,默认放到第0行。

4.

函数定义不能嵌套,但函数调用可以嵌套。

这个地方我觉得是我理解错了定义的含义,真是不好意思了。

5.

C语言字符串比较不能直接用关系运算符进行正确比较。

所以说,是可以比较的!!!

如果想正确比较的话,可以用字符串比较函数strcmp

strcmp(s1,s2);

它会按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。

相等,返回值=0;字符串1>字符串2,返回值1;字符串1<字符串2,返回值-1

本函数也可用于比较两个字符串常量,或比较数组和字符串常量。

6.

考察宏定义的二义性。顾名思义,二义性就是实际的结果和想得到的结果不一致。

举个栗子:

#define multi(a) a*a

main()

{

    int i

i=multi(2+2);

}

需要的结果是i = 4*4 = 16, 而实际被解析为  i = 2+2*2+2 = 8

解决问题:#define SQ(a)  (a)*(a) 则不会产生二义性。

7.

数据在内存中是以二进制形式存放的。数值以补码表示。

整型:一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1

实型:在内存中占4个字节,是按照指数形式存储的,实型数据分为小数部分和指数部分,分别存放!计算机用二进制表示小数部分,用2的幂次来表示指数部分!

字符型:在内存中字符的存储实际上是把字符相对应的ASCII代码放到存储单元中的。而这些ASCII代码值在计算机中也是以二进制形式存放的。这个与整型的存储很相似。因此这两类之间的转换也比较方便!

8.在作为函数形参时,intcharlong long等类型可混用……只是要注意范围问题。

9.do while语句中,一旦使用了continue就会跳过后面的循环条件判断……可以达到一直循环的效果。

10.若没有说明函数类型,默认是int型。

11.

char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};

printf("%c ",*language[1]);

上面的语句定义了一个字符类型的二维数组。输出结果为B

如果改为

printf("%s ",language[1]);

输出结果为BASIC。这是因为定义的是指向数组类型的指针……所以language[1]相当于BASIC这个字符串首字母的地址。

12.

设有说明int (*ptr)[M]; 其中ptr是:

一个指向具有M个整形元素的一维数组的指针。

13.

以下是对于指针操作顺序的一些实验:

int x[10]={0,1,2,3,10,5,6,7,8,9},*p1;

    p1=x+3;

    printf("%d",*p1++);

    printf("%d",*p1);

上面的语句会输出310。也就是说是*的优先度很低。

14.fscanf函数的正确调用格式是:文件指针,格式字符串,输入表列。

15.f(x1,x2+x3,x4,x5);函数调用过程中,含有的实参个数是:4

16.要打开一个已存在的非空文件“file”用于修改,正确的语句是:

fp=fopen(“file”,”r+”);

17.

char ch;

    scanf("%3c",&ch);

    printf("%c",ch);

如果输入abc<回车>,输出结果是a。实验之后发现是%3c这种语句在输入里没有意义。

18.

下面程序段的运行结果是___3___

char c[]=" v\will ";

printf("%d",strlen(c));

是字符串结束符,之后的字符都不算在长度之内,输出的时候也不会输出。

19.

main函数里定义的整形数组初始值是一堆乱码,在问输出结果的题里答案只能是0不要在意。

20.

short 2字节 int 4字节

21.

实参和形参使用不同的存储单元。

22.

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define  A 3.5

#define S(b) A*b*b

int main()

{

   int x=1,y=2;

   printf("%4.1f ",S(x+y));

}

讲道理,这道题真是对我智力和想象力的考验……答案是7.5

23.

else语句总是与和他最近的未配对的if语句匹配。

24.

除主函数之外,各函数之间既可以直接递归调用也可以间接递归调用。

25.

如果输出语句中写的变量类型与实际类型不符,会出现编译错误。

26.

只能在switch和循环体内用break语句。

27.

int最大值:

28.

当把一个数值在scanf中用八进制和十六进制输出时,无前缀。

比如11,输出结果就是:

11,13,b

29.

strcpy函数将b赋值给a的时候,如果ba中原本的字符数少,那么a中多几位字符不变。

原文地址:https://www.cnblogs.com/Shymuel/p/9130443.html