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语言易错题集 第二部相关推荐

  1. C语言易错题集 第四部

    C语言易错题集 第四部 一.位操作相关 二.switch()相关 三.输出相关 四.实数相关 五.指针&a相关 六.指针访问数组元素相关 七.转义字符相关 八.类型提升问题 九.是不是正确的浮 ...

  2. C语言易错题集 第三部

    目录 一.C语言程序exe相关 二.sizeof和strlen相关 三.小端存储相关 四.break和continue相关 五.函数声明相关 六.递归相关 七.预处理相关 八.C语言程序的最小单元相关 ...

  3. C语言易错题集 第一部

    目录 一.优先级相关 二.指针相关 三.标识符相关 四.指针相关 五.指针相关 六.指针相关 七.字符串相关 八.i++相关 九.传递相关 十.#include相关 十一.字符串长度相关 十二.复杂表 ...

  4. c语言解三元一次方程组_七年级下学期《8.3 一元一次不等式组》2020年高频易错题集...

    一.选择题(共10小题) 二.填空题(共5小题) 三.解答题(共5小题) 七年级下学期<8.5 一元一次不等式组>2020年高频易错题集 参考答案与试题解析 一.选择题(共10小题) [点 ...

  5. 并联串联混合的电压和电流_中考物理满分之路:《电阻的串联和并联》2020年高频易错题集...

    <串并联知识梳理> 一.识别串并联电路 1.定义法:用电器逐个顺次连接的电路是串联电路;用电器并列连接的电路是并联电路. 2.路径法:从电源的正极出发,沿电流的路径一直追寻到电源的负极,途 ...

  6. MOOC《程序设计入门——C语言》错题集

    章节 第二周 1变量-小测验 1.以下哪些是有效的变量名? 2.给定: 第三周 1判断-小测试 1.以下语句是否可以通过编译: 第六周 第一次单元测验 1.下列程序段输出结果为: 2.对于以下代码: ...

  7. C语言易错题--将一个整数转换为六进制打印

    题目来源:牛客网编程入门训练--BC111  小乐乐与进制转换 输入描述: 输入一个正整数n  (1 ≤ n ≤ 109) 输出描述: 输出一行,为正整数n表示为六进制的结果 解题思路:由十进制数字打 ...

  8. C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)

    题目来源:牛客网编程入门训练--BC115  小乐乐与欧几里得 输入描述: 每组输入包含两个正整数n和m.(1 ≤ n ≤ 109,1 ≤ m ≤ 109) 输出描述: 对于每组输入,输出一个正整数, ...

  9. 不等式解集怎么取_七年级下学期《8.2不等式及不等式组的解集》2020年高频易错题集...

    参考答案及试题解析 一.选择题(共10小题) [点评]本题考查了不等式的解集,解集本题的关键是明确解集的取法"同大取大,同小取小,大小小大,取中间". [点评]本题考查了不等式组的 ...

最新文章

  1. 在线作图|如何绘制一张好看的点棒图
  2. 自定义工作流任务控件
  3. 解复用FLV文件(基于FFMPEG解析FLV(h264+aac))
  4. 一个含有crc32算法的CrackMe分析
  5. JavaScript的文档窗口事件
  6. 天才基本法_强推|高人气合集狙击蝴蝶天才基本法春日玛格丽特难哄
  7. 如何用SQL来检测文件是否存在
  8. POJ3259-负权回路判定
  9. 软考笔记(数据结构篇)———— KMP算法
  10. 对给定数组升或降排序
  11. 概率图模型——贝叶斯网络
  12. MEMORY系列之“DDR参数”
  13. CPU的平均指令周期 怎么算,如何计算处理器的机器周期
  14. Guarded Suspension 设计模式
  15. 笔记本如何实现USB外接键盘开机?
  16. 写给Krpano小白们的最最最入门级教程(一)
  17. Windows重定向技术【文件重定向与注册表重定向】
  18. 64格棋盘放芝麻,求重量。
  19. Echarts迁徙图
  20. 史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了

热门文章

  1. Mysql升级过程的问题
  2. WSL(Windows Subsystem for Linux) 适用于Linux的Windows子系统
  3. redhat 6.2安装telnet服务
  4. poj1201Intervals(差分约束)
  5. 怎样在android平台上使用第三方jar包
  6. 告诉大家一个------无敌命令
  7. C++虚函数表,虚表指针,内存分布
  8. esp32 烧录固件
  9. 关于IAR的一些总结 -- ARM调试和Flash调试的区别
  10. Linux Device和Driver注册过程,以及Probe的时机