C语言类型

(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

 

  1. 下列不正确的转义字符是?

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;                                                    

请计算

  1. 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 端设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值