1.C语言的标识符?
答:C语言的标识符是由字母、数字和下划线组成,第一个字符不能是数字,只能是字母或者是下划线
2.以下选项中可用的合法整数是(选项B的数字中间有一个空格)
- A: Xff
- B: 1 2
- C: 0x77
- D: 018
答:首先整数的数字必须是连续的,选项B错误;C语言中,整数有八进制、十进制和十六进制三种表示形式,
十进制的数码取值为09,没有前缀;八进制的数码取值为07,必须以0开头,作为八进制数的前缀;十六进制的数码取值为:09,AF或a~f,前缀为0X或0x
3.对于if(表达式)语句,以下叙述正确的是
- A. "表达式"可以是常量
- B. "表达式"的值只能是整数值
- C. "表达式"不能是变量
- D. "表达式"中不可以出现字符
答: if(表达式)语句中,表达式通常是逻辑表达式或关系表达式,也可以是算术表达式或赋值表达式,甚至是一个变量或常量.
3.若有定义:int a,b,c;以下选项中的赋值语句正确的是:
- A: a = (b = c) + 1
- B: (a = b) = c = 1
- C: a = (b == c) = 1
- D: a + b = c
答: 赋值运算符的结合性是由右向左结合,赋值运算符左值为变量,右值为变量或常量, 且左右两边数据类型相同才能实现赋值.A选项中,将c赋值给b,让后将b+1赋值给a,正确.B选项中,将1赋值给c,赋值运算(a=b)=c中左值为表达式,不是变量不能被赋值,错误.C选项中赋值运算(b==c)=1左值为逻辑表达式,不是变量不能被赋值,错误.D错误
4.有如下程序:
#include<studio.h>
void main(){
char *p1 = 0;
int *p2 = 0;
double *p3 = 0;
printf("%d,%d,%d\n",sizeof(p1),sizeof(p2),sizeof(p3));
}
程序输出结果是:4 4 4
答:sizeof用来获取类型或数据对象的长度,也即是一个这种类型的变量在内存中所占字节数.由于一个变量的地址也是一个值,因此就可以把这个地址值存放到另一个变量里保存.这种专门用来存放变量地址的变量,称为"指针变量".所有类型的指针变量都是地址,所占字节数均为4
5.有如下程序:
#include<studio.h>
void main(){
int i,k;
int array[4][2] = {{1,2},{4,9},{6}};
for(int i=0;i<2;i++)
for(int k=0;k<4;k++){
printf("%d",array[k][i]);
}
printf("\n");
}
程序运行后的输出结果是: 1 4 6 0 2 9 0 0
答: 二维数组的初始化有2种方式,其中一种是分行初始化,方式为:数据类型数组名[行下标表达式][列下标表达式] = {{第0行初值表},{第1行初值表},....{最后一行初值表}};如果初值表只对部分元素赋初值,没有被赋值的元素将被自动赋值为0
6.有如下程序:
#include<studio.h>
void main(){
int i,*ptr;
int array[5] = {5,3,1};
for(ptr=array,i=0;i<5;i++,ptr++){
if(*ptr == 0){
putchar('X');
}else{
putchar('A' + *ptr);
}
}
printf("\n");
}
程序运行后输出的结果是:FDBXX
答:在对数组进行初始化时,如果对数组的全部元素赋以初值,定义时可以不指定数组长度,如果被定义数组的长度与初值个数不同,则数组长度不能省略;如果在说明数组时给出了长度,但没有给所有的元素赋初值,那么C语言将自动对剩下的元素赋初值,则array={5,3,1,0,0}.程序执行过程为:执行for循环,将数组首地址赋值给指针ptr,依次遍历每一个元素,如果数组元素为0则输出"X",如果不为0则按照字母表输出字符"A"后第array[i]个字符
7.有如下程序:(字符数组默认元素是'\0')
#include<studio.h>
void main(){
char name[10] = {'S','T','R','I','N','G'};
name[3] = 'E'; name[5] = 0;
printf("%s",name);
}
程序输出结果是: C
- A: STRENG
- B: STRIEG
- C: STREN
- D: STREN0
答:printf函数按照格式符说明输出对应的数据.%s控制符用于输出字符串,输出时从给定地址开始依次输出字符,直到遇到'\0'结束.给字符变量赋值0,相当于赋值'\0'.因为这是个字符数组,所以只能赋值字符和字符的ascii值,所以0是一个ascii值,对应的字符是'\0'.初始化时name="STRING",改动第4个和第6个字符元素之后字符串变为"STREN".
8.有如下程序
#include<studio.h>
int disp(char *str){
while(*str) putchar(*str++);
return *str;
}
void main(){
printf("%d\n",disp("NAME"));
}
程序输出结果是: A
- A: NAME0
- B: NAMEE
- C: NAME
- D: NAME\0
解析:调用disp函数,将字符串"NAME"首地址传给str,在while循环中,依次判断字符串中字符是否为'\0',不是'\0'则输出字符,否则结束循环.当(*str)='\0'时,结束循环,返回字符'\0'的ASCII值0,并输出. NAME0
9.有如下程序
#include<studio.h>
#define D(x) 4*x+1
void main(){
int i=2.j=4;
printf("%d\n",D(i+j));
}
程序输出结果是: B
- A: 25
- B: 13
- C: 9
- D: 12
解析: 带参数的宏定义不是进行简单的字符串替换,而是进行参数替换.替换过程是:用宏调用提供的实参字符串,直接置换宏定义命令中相应形参字符串,非形参字符串保持不变.调用函数D(i+j),进行替换为4*i+j+1=13
10.有如下程序
#include<studio.h>
void main(){
int a=-2,b=0;
while(a++ && ++b);
printf("%d,%d",a,b);
}
程序运行输出后结果是: D
- A: 0,2
- B: 0,3
- C: 1,3
- D: 1,2
解析:此题主要考察惰性求值
-2 1
-1 2
0 3 => 1 3
注意最后一个循环,前面为0也就是假,所以不会进行后面的运算