C语言易错题集 第二部
C语言易错题集后续
- 一、共用体相关(union)
- 二、do,while相关
- 三、char溢出相关
- 四、printf()相关
- 五、++相关
- 六、 for语句相关
- 七、calloc()相关
- 八、define相关
- 九、溢出相关
- 十、指针常量,常量指针相关
- 十一、多重指针相关
- 十二、指针相关
- 十三、abs()相关
- 十四、全局数组、局部数组赋值相关
- 十五、double误差相关
一、共用体相关(union)
问题: 共同体变量所占的内存长度等于最长的成员的长度。请问这句话的说法是正确的吗?
答案: 错误
共同体类型的特点
(1)同一共同体内的成员共用一个存储区,存储区的大小=成员占用字节长度最大值。【需要考虑内存对齐】对齐问题:1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间; 2.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除关系,该最大空间自动延伸; 延伸到可以整除为止
(2)在任一时刻,在一个共同体变量中,只有一个成员起作用。
(3)共同体类型中的成员类型可为任意已定义的数据类型。
二、do,while相关
执行如下代码, c 的值是:()
int a=0,c=0;
do{--c;a=a-1;
}while(a>0);
答案 : -1
程序最开始执行--c,现在c变成了-1,接着执行a=a-1,a也变成了-1,再执行while语句,while(a>0),判断为假,退出循环,故c= -1要注意的是: 条件为真,继续运行。
do-while 语句的一般形式为 :do语句while( 表达式 ) ;
这个循环与 while 循环的不同在于 : 它先执行循环中的语句 , 然后再判断表达式是否为真 ,
如果为真则继续循环;如果为假 , 则终止循环。因此 , do-while 循环至少要执行一次 循环语句 。
使用while语句应注意以下几点:
1 、 while 语句中的表达式一般是关系表达或 逻辑表达式 ,只要表达式的值为真 ( 非 0) 即可继续循环。
2 、循环体如包括有一个以上的语句,则必须用 {} 括起来,组成复合语句。
三、char溢出相关
#include<stdio.h>
int main(void)
{char a=101;int sum=200;a+=27;sum+=a;printf("%d\n",sum);return 0;
}
问输出什么 ?
答案: 72char类型的范围是-128---+127,当a+=27 ,之后a的值超出可表示范围会变为-128.200-128=72
我个人关于位数溢出的问题,习惯把它想象为一个轮回
如下图
四、printf()相关
#include<stdio.h>
int main()
{ int a=666,b=888;printf("%d\n",a,b);return 0;
}
程序运行后的输出结果是( )。
A 错误信息
B 666
C 888
D 666,888
答案 : B
printf()函数 是 从右往左 入栈(计算表达式),输出是从左往右
所以:
该题 printf函数参数的入栈顺序是从右到左(888先入栈,接着666入栈)。
所以从栈里面读取一个数据时,只会读取最后入栈的数据,也即666.
五、++相关
有如下定义#define D 2 int x=5;floaty=3.83; char c=′D′; 则下面选项中错误的是()。
A x++;
B y++;
C c++;
D D++;
答案: D
D是因为我们不能对宏进行取地址操作,而++操作是先从内存取值到寄存器
然后寄存器加一后再写入内存中必然涉及如地址操作
六、 for语句相关
设 m 和 n 都是 int 类型,那么以下 for 循环语句,___
for(m=0,n=-1;n=0;m++,n++)n++;A 循环体一次也不执行
B 循环体执行一次
C 是无限循环
D 有限次循环
E 循环结束判断条件不合法
F 运行出错
答案: A
上机测试,for循环的条件判断语句中,如果使用赋值语句或常量值,
当值为0时,不执行循环体,
当值为非0时,无限循环。所以,选A
当 n为0时:
当 n为1时:
当 n为-1时:
当 n为-2时:
可以看出,当n值为非0时,无限循环。
七、calloc()相关
有以下程序
#include<stdio.h>
#include<stdlib.h>
void fun( double *pl,double *p2,double *s)
{s = ( double*) calloc ( 1,sizeof(double));*s = *pl + *(p2+1);
}
int main(void)
{double a[2]={1.1,2.2};double b[2]={10.0,20.0};double *s=a;fun(a,b,s);printf("%5.2f\n",*s);return 0;
}
程序的输出结果是?
答案: 1.10编译器编译时给指针参数提供临时副本 _p,使得_p=p。
如果函数体内的程序修改了_p指向的内容,就导致参数p指向的内容也被做了相应的修改,因为他们指向同一内存空间。
在本例中,_p 申请了新的内存,只是把_p 所指的内存地址改变了,但是p 丝毫未变(即修改了p本身的值而不是_p指向的对象)
八、define相关
定义宏#define DECLARE(name, type) type name##_##type##_type,
则DECLARE(val, int)替换结果为()A int val_int_type
B int val_int_int
C int name_int_int
D int name_int_name
答案 : A##是一种分隔连接方式,它的作用是先分隔,然后进行强制连接
“name”和第一个“_”之间被分隔了,
所以预处理器会把name##_##type##_type解释成4段:“name”、“_”、“type”以及“_type”,
name和type会被替换,而_type不会被替换
九、溢出相关
下列代码的运行结果()
short i=65537;
int j=i+1;
printf(“i=%d,j=%d\n”, i, j);A i=65537,j=65538
B i=1,j=2
C i=-1,j=0
D i=1,j=65538
答案: B
short是2个字节 范围为 -32768~~32767
65537-32767=32770 按照循环要向后走32770下 即32770-32768=2
还有最后两下 0 1 即向后移动32770下后到1这个位置 所以i=1
十、指针常量,常量指针相关
下面3段程序代码的效果一样吗?
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;A (2)=(3)
B (1)=(3)
C (1)=(2)
D 都不一样
E 都一样
答案 C
const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);
在*的右边,则指针的指向不可变。简记为"左定值,右定向"。常量指针: 指针所指向的数不能改变 例: int const *b;
指针常量: 指针的指向是固定的 例: int *const b;
十一、多重指针相关
A WORLD,LO,SAYHI,EW
B WORLD,LO,HI,NEW
C NEW,LO,SAYHI,EW
D WORLD,LO,HI,EW
答案: D
答案:D;
第一个printf:由于char***cpp,可以读成cpp为一个指向char**类型的指针,并且初始化为cp,
而cp是一个指针数组,数组里面存储的类型为char**,也就是cpp指向cp[0],故*cpp=cp[0];
因此++cpp使得cpp指向cp[1],故*++cpp=cp[1];而cp[1]是一个指向c[2]的指针,因此*cp[1] = c[2],
故**++cpp=*cp[1]=c[2],故输出WORLD;第二个printf:由优先级可得知,单目运算符高于算术运算符;而*和++是单目运算符,+是算术运算符,
又cpp本身是指向的cp[1],故++cpp使得cpp指向cp[2],故*++cpp则为cp[2],而此时的cp[2]是一个指向c[1]的地址,
故对指向c[1]的指针cp[2]进行--,故使得cp[2]指向的是c[0],故*--*++cpp+3=*--cp[2]+3=c[0]+3,
而这里的c[0],其实存放的是指向HELLO字符串的指针故c[0]+3,使得该指针指向HELLO中的第二个L的位置,故输入LO;第三个printf:由于cpp目前指向的是cp[2],而cpp[-2]是等于*(cpp-2),而在第二个printf时cpp指向cp[2],
则*(cpp-2) = cp[0](注:这里cpp-2后,cpp本身的指针地址没有改变,因此在第四个printf中,cpp依旧是指向cp[2]),
又cp[0]是一个指向c[3]的指针,对cp[0]进行*运算,使得*cp[0]=c[3],故**(cpp-2)=*cpp[-2]=c[3],
同时c[3]是一个指向SAYHI的指针,故c[3]+3,使得指向H的位置,故输出HI;第四个printf:在第三个printf并没有改变cpp的地址,故cpp依旧是指向cp[2],又cpp[-1][-1]+1=*(*(cpp-1)-1)+1,
故cpp-1,则cpp指向cp[2],故*(cpp-1)=cp[1];此时的cp[1]是一个指针,指向c[2],故cp[1]-1是从指向c[2]的指针地址-1,
故是指向c[1],则*(*(cpp-1)-1)=*(cp[1]-1)=c[1],故cpp[-1][-1]+1=*(*(cpp-1)-1)+1=c[1]+1,此时的c[1]同样是一个指针,
故c[1]+1是指向NEW中的E的位置,故输出EW。
故答案是D。
十二、指针相关
有以下程序段:
char *p, *q;
p = (char *)malloc(sizeof(char) * 20);
q = p;
scanf(“%s %s”, p, q);
printf(“%s %s\n”, p, q);
若从键盘输入:abc def↙,则输出结果是( )
A def def
B abc def
C abc d
D d d
答案 : A
p和q是指向同一地址,故答案肯定是输出一样的字符串,输入字符串后,p q最开始指向abc ,
当输入def后,开始的地址被覆盖,一起指向def
十三、abs()相关
math.h的abs返回值()
A 不可能是负数
B 不可能是正数
C 都有可能
D 不可能是0
答案: Cc中的函数申明为 int abs(int num);
正常情况下,
num为0或正数时,函数返回num值;
当num为负数且不是最小的负数时(不要问我最小的int类型负数是多少),
函数返回num的对应绝对值数,即将内存中该二进制位的符号位取反,并把后面数值位取反加一;
当num为最小的负数时(即0x80000000),由于正数里int类型32位表示不了这个数的绝对值,所以依然返回该负数。
这就是设计这个库函数的时候为什么把返回值设置为int而不是unsigned的原因
,当然如果把返回值设置为unsigned是不是更加合理呢,这个也许有更好的解释,期待...
十四、全局数组、局部数组赋值相关
int a[10] = {2,3,5}, 请问a[3]及a[3]之后的数值是什么?()A 不确定的数据
B 5
C 0
D 0xffffffff
答案: C1、未初始化的全局数组为0;
2、未初始化的局部数组为随机值;
3、初始化部分的全局数组与局部数组,初始化部分为初始化值,未初始化部分都为0;(不管全集还是局部)
十五、double误差相关
以下数字在表示为double(8字节的双精度浮点数)时存在舍入误差的有()。
A 2的平方根
B 10的30次方
C 0.1
D 0.5
E 100
答案: A B CA. 2的平方根,本身就是无限小数,因此肯定有舍入误差
B. 10的30次方,明显超出了double的数据存储范围,故有舍入误差
C. 0.1不能用2的负整数次方来表示,因此有误差
D. 0.5 = 2^(-1),因此没有误差
E. 100的二进制表示是:0110 0100,因此没有误差总结:小数点后的位权应该是2的负数次方才没有误差,其它的情况都有误差
C语言易错题集 第二部相关推荐
- C语言易错题集 第四部
C语言易错题集 第四部 一.位操作相关 二.switch()相关 三.输出相关 四.实数相关 五.指针&a相关 六.指针访问数组元素相关 七.转义字符相关 八.类型提升问题 九.是不是正确的浮 ...
- C语言易错题集 第三部
目录 一.C语言程序exe相关 二.sizeof和strlen相关 三.小端存储相关 四.break和continue相关 五.函数声明相关 六.递归相关 七.预处理相关 八.C语言程序的最小单元相关 ...
- C语言易错题集 第一部
目录 一.优先级相关 二.指针相关 三.标识符相关 四.指针相关 五.指针相关 六.指针相关 七.字符串相关 八.i++相关 九.传递相关 十.#include相关 十一.字符串长度相关 十二.复杂表 ...
- c语言解三元一次方程组_七年级下学期《8.3 一元一次不等式组》2020年高频易错题集...
一.选择题(共10小题) 二.填空题(共5小题) 三.解答题(共5小题) 七年级下学期<8.5 一元一次不等式组>2020年高频易错题集 参考答案与试题解析 一.选择题(共10小题) [点 ...
- 并联串联混合的电压和电流_中考物理满分之路:《电阻的串联和并联》2020年高频易错题集...
<串并联知识梳理> 一.识别串并联电路 1.定义法:用电器逐个顺次连接的电路是串联电路;用电器并列连接的电路是并联电路. 2.路径法:从电源的正极出发,沿电流的路径一直追寻到电源的负极,途 ...
- MOOC《程序设计入门——C语言》错题集
章节 第二周 1变量-小测验 1.以下哪些是有效的变量名? 2.给定: 第三周 1判断-小测试 1.以下语句是否可以通过编译: 第六周 第一次单元测验 1.下列程序段输出结果为: 2.对于以下代码: ...
- C语言易错题--将一个整数转换为六进制打印
题目来源:牛客网编程入门训练--BC111 小乐乐与进制转换 输入描述: 输入一个正整数n (1 ≤ n ≤ 109) 输出描述: 输出一行,为正整数n表示为六进制的结果 解题思路:由十进制数字打 ...
- C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)
题目来源:牛客网编程入门训练--BC115 小乐乐与欧几里得 输入描述: 每组输入包含两个正整数n和m.(1 ≤ n ≤ 109,1 ≤ m ≤ 109) 输出描述: 对于每组输入,输出一个正整数, ...
- 不等式解集怎么取_七年级下学期《8.2不等式及不等式组的解集》2020年高频易错题集...
参考答案及试题解析 一.选择题(共10小题) [点评]本题考查了不等式的解集,解集本题的关键是明确解集的取法"同大取大,同小取小,大小小大,取中间". [点评]本题考查了不等式组的 ...
最新文章
- 在线作图|如何绘制一张好看的点棒图
- 自定义工作流任务控件
- 解复用FLV文件(基于FFMPEG解析FLV(h264+aac))
- 一个含有crc32算法的CrackMe分析
- JavaScript的文档窗口事件
- 天才基本法_强推|高人气合集狙击蝴蝶天才基本法春日玛格丽特难哄
- 如何用SQL来检测文件是否存在
- POJ3259-负权回路判定
- 软考笔记(数据结构篇)———— KMP算法
- 对给定数组升或降排序
- 概率图模型——贝叶斯网络
- MEMORY系列之“DDR参数”
- CPU的平均指令周期 怎么算,如何计算处理器的机器周期
- Guarded Suspension 设计模式
- 笔记本如何实现USB外接键盘开机?
- 写给Krpano小白们的最最最入门级教程(一)
- Windows重定向技术【文件重定向与注册表重定向】
- 64格棋盘放芝麻,求重量。
- Echarts迁徙图
- 史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了