(CPU寄存器存储相关)
基本类型
请填写bool , float, 指针变量 与“零值”比较的if 语句。
提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”。例如int 变量n 与“零值”比较的if 语句为:if ( n == 0 ) if ( n != 0 ) 以此类推。
(1)请写出bool flag 与“零值”比较的if 语句:
【标准答案】if ( flag ) if ( !flag )
(2)请写出float x 与“零值”比较的if 语句:
【标准答案】 const float PERSION = 0.00001;
if ((x >= - PERSION ) && (x <= PERSION ) 不可将浮点变量用“==” 或“!=” 与数字比较,应该设法转化成“>=” 或“<=” 此类形式。
(3)请写出char *p 与“零值”比较的if 语句
【标准答案】 if (p == NULL) if (p != NULL)
扩展
若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为?
A、 a<>0
B、 !a
C、 a=0
D、 a
【答案】B
下列变量定义中合法的是?
A、short _a=1-.1e-1;
B、double b=1+5e2.5;
C、long do=0xfdaL;
D、float 2_and=1e-3;
【答案】A
不能做switch()的基本参数类型是:
【标准答案】switch 的参数不能为实型(float、double)。
有符、无符、取值范围
#define Max_CB 500
void LmiQueryCSmd(StructMSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
} 这段代码执行有什么问题?
【标准答案】死循环unsigned char //无符号字符型表示范围0~255
char // 有符号字符型 表示范围-128~127
4、下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b> 6)? puts("> 6") : puts("<= 6");
}
【参考答案】C 语言中的整数自动转换原则,无符号整型问题的答
案是输出是“>6” 。原因是当表达式中存在有符号类型和无符号类型时所有
的数都自动转换为无符号类型。因此-20 变成了一个非常大的正整数,所
以该表达式计算出的结果大于6 。这一点对于应当频繁用到无符号数据类
型的嵌入式系统来说是丰常重要的。
若有以下定义: char a; int b; float c; double d; 则表达式a*b+d-c值的类型为?
A、 float
B、 int
C、 char
D、 double
【答案】D
若int类型占两个字节,则以下语句 int k=-1; printf("%d,u%",k,k); 输出为?
A、-1,-1
B、-1,65536
C、-1,32768
D、-1,65535
【答案】D
在C语言中,合法的长整型常数是?
A、OL
B、4962710
C、324562&
D、216D
【答案】A
若变量a是int类型,并执行了语句:a=‘A'+1、6;,则正确的叙述是?
A、 a的值是字符C
B、 a的值是浮点型
C、 不允许字符型和浮点型相加
D、 a的值是字符‘A’的ASCII值加上1
【答案】D
5、凡在函数中未指明存储类别的变量,其隐含的存储类别为?
A、auto 型
B、static 型
C、extern 型
D、register 型
【答案】A
C语言提供的合法的数据类型关键字是?
A、double
B、 short
C、 integer
D、 char
【答案】B
C语言中最简单的数据类型包括?
A、 整型、实型、逻辑型
B、 整型、实型、字符型
C、 整型、字符型、逻辑型
D、 整型、实型、逻辑型、字符型
【答案】B
程序片段:在TC20中, int i=65536; printf("%d",i);的输出结果是?
A、 65536
B、 0
C、 有语法错误,无输出结果
D、 -1
【答案】B
合法的C语言中,合法的长整型常数是?
A、 '\t'
B、 "A"
C、 65
D、 A
【答案】A
ASCII码及转义
若变量c为char类型,能正确判断出c为小写字母的表达式是?
A、'a'<=c<= 'z'
B、(c>= 'a')||(c<= 'z')
C、('a'<=c)and ('z'>=c)
D、(c>= 'a')&&(c<= 'z')
【答案】D
设有说明语句:char a='\72';则变量a?
A、包含1个字符
B、包含2个字符
C、包含3个字符
D、说明不合法
【答案】A
- 下列不正确的转义字符是?
A、'\\'
B、'\"
C、'074'
D、'\0'
【答案】C
在C语言中,合法的字符常量是?
A、'\084'
B、'\x43'
C、'ab'
D、"\0"
【答案】B
不同类型的运算及隐式转化
若有以下定义和语句:char c1='b',c2='e'; printf("%d,%c\n",c2-c1,c2-'a'+'A'); 则输出结果是?
A、2,M
B、3,E
C、2,E
D、输出项与对应的格式控制不一致,输出结果不确定
【答案】B
若已定义x和y为double类型,则表达式:x=1,y=x+3/2的值是?
A、1
B、2
C、2.0
D、2.5
【答案】C
若有定义:int a=8,b=5,c;,执行语句c=a/b+0.4;后,c的值为?
A、 1.4
B、 1
C、 2.0
D、 2
【答案】B
数组
1.一维数组
int main()
{
int a[5]={1,2,3,4,5};
int * ptr=(int*)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
return 0;
}
请问输出:
【标准答案】2,5
注:数组名是标识符或指针常量;数组名作为指针代表数组首地址即首元素地址a=&a=&a[0],a+1=a+sizeof(a[0]),类型是int[5];对数组名取地址代表整个数组,类型即int[5]*,&a + 1= a+sizeof(a)
C语言中数组下标的下限是?
A、1
B、0
C、视具体情况
D、无固定下限
【答案】B
2.二维数组
若有定义:int a[3][4];不能表示数组元素a[1][1]的是?
A、*(a[1]+1)
B、*(&a[1][1])
C、(*(a+1))[1]
D、*(a+5)
【答案】D
3、字符数组
设有如下定义:char *aa[2]={"abcd","ABCD"};则以下说法中正确的是?
A、aa数组元素的值分别是"abcd"和"ABCD"
B、aa是指针变量,它指向含有两个数组元素的字符型一维数组
C、aa数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
D、aa数组的两个元素中各自存放了字符'a'和'A'的地址
【答案】D
字符串
函数调用:strcat(strcpy(str1,str2),str3)的功能是?
A、将串str1复制到串str2中后再连接到串str3之后
B、将串str1连接到串str2之后再复制到串str3之后
C、将串str2复制到串str1中后再将串str3连接到串str1之后
D、将串str2连接到串str1之后再将串str1复制到串str3中
【答案】C
下列对C语言字符数组的描述中错误的是?
A、字符数组可以存放字符串
B、字符数组中的字符串可以整体输入、输出
C、可以在赋值语句中通过赋值运算符“=”对字符数组整体赋值
D、不可以用关系运算符对字符数组中的字符串进行比较
若有定义和语句: char s[10]:s="abcd";printf("%s",s); 则结果是(以下u代表空格)?
A、 输出abcd
B、 输出a
C、 输出abcduuuuu
D、 编译不通过
【答案】D
复合类型
1、c和c++ 中的struct有什么不同?
【标准答案】c和c++ 中struct的主要区别是c中的struct不可以含有成员函数,而c++ 中的struct可以。c++ 中struct和class的主要区别在于默认的存取权限不同,struct默认为public ,而class默认为private。
2、typedef 在C 语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s * //使用宏的缺点
typedef struct s * tPS; //定义类型的好处
以上两种情况的意图都是要定义dPS 和tPS 作为一个指向结构s指针。哪种方法更好呢
(如果有的话)为什么?
【参考答案】这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef 更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一个扩展为
struct s * p1, p2;上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许
不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。
对于定义union data {int i; char c; float f;}a, b; 描述正确的是:
A、变量a 的地址和它的成员地址都是相同的
B、可以在定义类型的同时定义变量a ,并对a的任意成员初始化
C、变量a所占内存的长度等于成员f 的长度
D、如果有定义语句 union data a={6};则对变量a的初始化是正确的
【答案】ACD
关于”任何”类型
1、问:设计一个能接受任何类型的参数并返回interger(整数)结果的函数吗?
答:int func(void *ptr)
如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。
占用内存字节数
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。与strlen的区别:
一、sizeof是运算符,确切的说是一个编译时运算符,参数可以是数组、指针、类型、对象、函数等。用于统计类型或者变量所占的内存字节数。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。
二、strlen()是C标准库中的字符串函数,要在运行时才能计算。参数必须是字符型指针(char*), 且必须是以'\0'结尾的。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'。返回的长度大小不包括'\0'。
三、实例
1、
char *str = "hello"; //”hello”作为字符串常量被分配到代码段(只读区)
printf("%d\n",strlen(str)); //它的值是5,因为hello这个字符串有个字符
printf("%d\n",sizeof(str)); //它的值是6,因为char *是一个指针类型,它占个字节。
printf("%d\n",sizeof("hello")); //它的值是,是因为hello有个字符,每一个字符占个字节,统计包含'\0'。
printf("%d\n",sizeof(""));//值是1
设有数组定义: char array [ ]="China"; 则数组 array所占的空间为?
A、4个字节
B、5个字节
C、6个字节
D、7个字节
【答案】C
2、int a[2] = {0};
sizeof(a); //它的值是8,因为a中有2个int型变量,每个int型占4个字节,所以8字节
strlen(a) //a相当于一个指针,但是strlen只能接受char*类型,所以编译时出错
3、char arr[10] = "Hello";
int len_one = strlen(arr);
int len_two =sizeof(arr);
cout << len_one <<" and " << len_two << endl;
输出结果为:5 and 10
strlen只关心存储的数据内容,不关心空间的大小和类型。
sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据(10x1)。
假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是?
A、 3
B、 6
C、 10
D、 20
【答案】D
4、char * parr =new char[10];
int len_one = strlen(parr);
int len_two = sizeof(parr);
int len_three = sizeof(*parr);
cout << len_one <<" and " << len_two << " and " <<len_three << endl;
输出结果:3 and 4 and 1
第一个输出结果3实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始直到遇到第一个'\0'结束);
第二个结果实际上本意是想计算parr所指向的动态内存空间的大小,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4)
第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。
扩展:4.1
void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
【标准答案】sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。
5、以下为Linux下的32 位C 程序,请计算sizeof 的值。
char str[] = “Hello” ; char *p = str ; int n = 10;
请计算
- sizeof (str ) =6 (2)sizeof ( p ) = 4 (3)sizeof (n) =4
(4)
void Func ( char str[100])
{
… ;
}
请计算sizeof( str ) = 4 //数组作为函数的参数退化为指针类型
(5)void * p = malloc( 100 );
请计算sizeof ( p ) = 4
面试题:定义一个空的数据类型struct Kong{} k,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果是多少?
答案:是1,为什么不是0?空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例时,它必须在内存中占有一定的空间,否则无法使用这些实例(也就不能求sizeof了),至于占用多少内存,由编译器决定,Visual Studio中每个空类型的实例占用1字节的空间。
扩展1:如果在该类型中添加一个构造函数和析构函数,再求sizeof,得到的结果是多少?
答案:还是1。调用构造函数和析构函数只需要知道函数的地址即可,而这些地址只与类型相关,而与类型的实例无关,编译器也不会因为这两个函数而在实例内添加任何额外的信息。
注:不管添加的是构造函数还是析构函数还是其它任何类型的函数,都是这个结果。
扩展2:那如果把析构函数标记为虚函数呢?
答案:C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针,在32位机器上,一个指针占4字节空间,因此求sizeof得到4;如果是64位则为8。测试用例:
[cpp] view plain copy
#include <stdio.h>
struct nullType { };
struct type1
{
type1() {}
~type1() {}
int print() { printf("Alexia");return 0;}
};
struct type2
{
type2() {}
virtual ~type2() {}
};
int main()
{
printf("sizeof(nullType) = %d\n", sizeof(nullType));
printf("sizeof(type1) = %d\n", sizeof(type1));
printf("sizeof(type2) = %d\n", sizeof(type2));
return 0;
}
6、设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句printf("%d",sizeof(struct date)+sizeof(max)); 的执行结果是:_____
【标准答案】DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20. data是一个struct, 每个变量分开占用空间.依次为int4+DATE20 + double8 = 32.所以结果是20 + 32 = 52.
注:在某些16位编辑器下, int 可能是2字节,那么结果是int2 + DATE10 + double8 = 20
7、给定结构
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}; 问sizeof(A) = ?
【标准答案】8 位按类型算
扩展1:
struct name1{
char str;
short x;
int num;
} ;求sizeof(name1)?
【标准答案】8
扩展2:
struct name2{
char str;
int num;
short x;
}; 求sizeof(name2)?
【标准答案】12
注:见网上详解自然对界最详细解释 提高cpu访问数据的速度。关注下伪指令#pragma pack(n)、big-little 端设置。