1.给出以下定义,下列哪些操作是合法的?
const char *p1 ="hello";
char *const p2 = "world";
A.p1++;
B.p1[2] = ‘w’;
C.p2[2] = ‘l’;
D.p2++;
答案:A
p1是指向字符常量的指针,p1本身不是常量,所以p1++合法,A正确,p2本身是指针常量,可以指向非常量的字符,但是"hello"这样声明的字符串是存储在只读存储区的,不可修改,所以B,C错误,p2也是指向字符常量的指针,p2本身是常量,所以p1++不合法,A错误
*2.char s = “\ta\017bc”;指针变量s指向的字符串所占的字节数是多少?
答案:6
’\017’转义字符 ASCII代码值为8进制数17即10进制数15的那个符号
3.三个用户在同一系统中使用同一个编译程序同时对他们的C语言源程序进行编译,此时系统应分别为各用户创建一个C编译进程并各保留一份C编译程序副本,这样的说法正确吗?
答案:不正确
如果三个用户运行同一个程序(编译程序),则系统将创建3个进程,但这3个进程共享C 编译程序的1个副本,而不是3个副本
4.在C语言中,此定义和语句是合法的,请问这句话的说法是正确的吗?
enum aa {
a=5,
b,
c
} bb;
bb = (enum aa)5;
答案:正确
enum aa{a=5,b,c} bb;是C语言中定义的枚举类型,意思是:定义aa这个数据类型,其取值范围是a,b,c三个数,其中,a=5,b=6,c=7(如果不给b,c指定数值,就是其前一个数+1),同时定义aa这个数据类型的变量bbbb=(enum aa)5;和你学到的int a = (int)b;功能一样,是把数值5强转成(enum aa)数据类型,同时赋值给变量bb
枚举类型可以向整型自动转换,整型向枚举类型转换需要强制类型转换
5.在C语言中,一个函数一般由两个部分组成,函数首部和函数体
6.auto和register修饰的变量只有在使用时才为该变量分配内存空间
7.fseek(文件类型指针,位移量,起始点)
8.对于下面的代码,哪个是正确的,哪个是错误的?
char * s1 = "Hello world";
char s2[] = "Hello world";
s1[2] = 'E'; // 1
s2[2] = 'E'; // 2
* (s1 + 2) = 'E'; // 3
* (s2 + 2) = 'E'; // 4
答案:s1是一个指针,指向一个常量字符串,这个字符串不能更改,所以1、3错误,s2是一个数组名,里面的数据可以更改,2、4正确
9.以下程序的运行结果是?
#include <stdio.h>
int main(void)
{
printf("%s , %5.3s\n", "computer", "computer");
return 0;
}
答案:computer@,@@com(@表示空格)
%m.ns 表示输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左侧补空格,所以%5.3s 是输出占5列,但只取字符串中左端3个字符,这3个字符输出在5列的右侧,左侧补空格,所以输出的是前三个字符@@com,如果是%5s,5<字符串长度,将会打印全部,如:printf("%5s\n",“abcdefjh”); 结果将是:abcdefjh
10.语句printf(“a\bre\’hi\’y\\bou\n”);的输出结果是re’hi’you,’\b’是退格符,输出时将光标往左边回退一个位置
11.float变量加法不一定满足交换律