请填写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 { ......; } 这段代码执行有什么问题? 【标准答案】死循环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 若变量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 " < 输出结果: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; 请计算 (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 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 端设置。ASCII码及转义
不同类型的运算及隐式转化
数组
字符串
复合类型
关于”任何”类型
占用内存字节数