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.在作为函数形参时,int,char,long long等类型可混用……只是要注意范围问题。
9.do while语句中,一旦使用了continue就会跳过后面的循环条件判断……可以达到一直循环的效果。
10.若没有说明函数类型,默认是int型。
11.
char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};
printf("%c\n",*language[1]);
上面的语句定义了一个字符类型的二维数组。输出结果为B。
如果改为
printf("%s\n",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[]="\t\v\\\0will\n";
printf("%d",strlen(c));
\0是字符串结束符,之后的字符都不算在长度之内,输出的时候也不会输出。
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\n",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的时候,如果b比a中原本的字符数少,那么a中多几位字符不变。