C语言题目
1、给定c语言代码段:
t=0;
while(printf("*"))
{
t++;
if(t<3) break;
}
下面描述正确的是:
A 其中循环控制表达式与0等价
B 其中循环控制表达式与’0’等价
C 其中循环控制表达式是不合法的
D 以上说法都不对
解释
他说的是printf("")与‘0’等价
其实是这样的 printf这个函数的返回值是输出字符的个数
现在printf("")的返回值是1
在while里只有0 和非0两种
所以只要选排一个非0的就能说是等价的
而‘0’需要转成ASCII码看是不为0的,是48 所以选B
2、若变量a,i已正确定义,且i已正确赋值,合法的语句是?
A.a==1 B.++i; C.a=a++=5; D.a=int(i);
解释
首先A选项就不是语句没有用分号结尾
B选项是对的
C不对,a++是将a自增在赋值
D选项首先,如果int()是函数,很明显和关键字重复,所以它不是函数
其次,如果是强制转换,形式应该是(int)i
3、若有定义:float w;int a,b;,则合法的switch语句是
A switch(w)
{ case1.0:printf("*\n");
case 2.0:printf("**\n");
}
B:switch(w);
{ case 1:printf("*\n");
case 2:printf("**\n");
}
C:switch(b)
{ case1:printf("\n");
default:printf("\n")
case 1+2:printf("**\n");
}
D:switch(a+b);
{ case1:printf("\n")
case 2:printf("**\n")
}
解释
switch后的括号里只能是整型常量(包括能转换为int型的数据,如:int,char和枚举类型),显然w的都不对,a+b也不对,因为它们不是确定的整数。A 、B
错误
B、D中,switch();包含分号,所以错误。选C
4、 若有说明:int a[][4]={0,0};则下面不正确的叙述是
A)数组a的每个元素都可得到初值0
B)二维数组a的第一维大小为1
C)当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小
D)只有元素a[0][0]和a[0][1]可得到初值,其余元素均得不到确定的初值
正确答案:D
https://kaoshi.china.com/ncre/learning/950220-1.htm
5、以数组名作函数参数时,实参数组与形参数组都不必定义长度,因此实参以数组名作函数参数时,实参数组与形参数组都不必定义长度,因此实参与形参的结合方式是地址结合,与数组长度无关,这句话对吗
解释
不对
形参可以不定义长度,因为等效于指针。
但实参 必须定义长度
即使是指针类型 ,也需要指向特定空间,或者分配动态内存,实际上 还是有长度约束的。
最后一句实参与形参的结合方式是地址结合,与数组长度无关 这个是对的。
6、主函数只能调用其他函数,不能调用自身;其他函数可以自己调用自己,递归调用。
7、若有宏定义:#define S(a,b) t=a;a=b;b=t由于变量t没定义,所以此宏定义是正确的.。
解释
宏就是符号定义,宏扩展时只是字符串替换,所以这个宏是正确的,也能正常使用。如:
#include "stdio.h"
#define s(a,b) t=a;a=b;b=t
int main(int argv,char *argc[]){
int x=4,y=123,t;
printf("x = %d\ty = %d\n",x,y);
s(x,y);
printf("x = %d\ty = %d\n",x,y);
return 0;
}