永发信息网

C语言 共用体中的各种类型转换的原则

答案:3  悬赏:80  手机版
解决时间 2021-05-04 13:51

main()

{union

  {

       int k;

       char i[2];

   }*s,a;

  s=&a;

  s->i[0]=0x39;s->i[1]=0x38;

  printf("%x\n",s->k);

}

最佳答案
一、基础知识和数据类型、表达式

1、{},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。

2、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。

3、混淆/和\;注释对应的符号是,而转义字符是以\开头,除号是/。

4、printf()和scanf()的参数设置有误,主要表现在以下几方面:

l    类型不匹配的问题。(例如:有float a=3.5,但输出的时候printf(“a=%d”,a);则屏幕上会显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应%f, int对应%d, char对应%c。

l    个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。

l    scanf()中变量前忘了加&。记住:scanf()中变量前要有&(但后边学到的字符数组名和指针前不用加)

5、定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium of circle;一般情况下可用下划线将三个单词连接在一起。

6、在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。

 void main()

{ int I,a[10], sum=0;  

for(I=0;I<10;I++) sum+=a[I];

printf(“%d”,sum);

}

7、计算错误。主要注意:++,――和其它运算符一起运算时,除根据优先级进行计算时,还要考虑先后位置的特殊含义;数据类型不一致时发生的自动转换也会导致计算的误差;还要注意求模结果的符号与被除数相同;某些特殊情况下 使用懒惰求值法。

8、不能除以0,要做合法性检查;

9、类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范围之内;

10、数学表达式的格式有误。常见的有:(1)数学与C语言运算表达式的混淆(例如:=表示赋值,而= =才表示我们数学中的相等关系)。(2)、忽略了运算的优先级。解决这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完优先级高的一个表达式后加上()再写下一级的表达式,例如:计算梯形的面积时,要s=((a+b)*h)/2,不要1/2*a+b*h. (3)忽略了计算和赋值时的自动转换。例如:float half=1/2;这样,因为=右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不是变量,例如:若有#define PI 3.14,程序中又出现PI=3.14159。又例如:f(n)=f(n-1)*n(这是典型的数学语言,在C语言中右边的乘积不能正确存储,而左边又是一个函数调用)。

11、使用库函数前忘了加#include<?.h>



二、流程控制

1、  丢掉语句结束标记“;”,尤其是for语句中表达式后或do-while语句后的分号,或在预处理命令后边、while()后、for()后加“;”;

2、  If语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意C语言的条件与数学表达式的区别(例如我们数学中经常写到的0≤x≤9,在C语言中应该写成x>=0&&x<=9)。

3、  if-else嵌套时不配对。最好在写每个条件时要用两个{}分别将两个分支先括起来,再添加其中的语句,以保证其配对不易错。

4、  switch()语句中的格式不正确。()中的表达式结果一定是一些明确的值,不能是区间;表达式的所有可能结果要列在case后边,case与常量之间有一空格,不要丢掉必要的break;

5、  随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循环体中,不要将循环控制变量进行另外的改变。

6、  分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当I不变,j又循环一遍的时候用双重循环。当I,j同时变化的时候用一重循环,此时,循环控制变量有两个,但条件只写一个就可以,因为另一个总是进行相应的变化的。

7、  忽略循环体与循环控制变量的关系。其实,很多情况下,循环控制变量都在循环体中起到非常重要的作用。应该利用上这种关系。



三、数组与指针

1、  字符串的输入有错误:主要表现在使用scanf()或gets()时加了&,或输入字符串时用循环,(这样的话,字符个数无论多长,都不会为自动加\0,将来引用的时候也就不能以字符串的形式引用。)

2、  对字符串的处理中,循环条件仍然写成I<N。由于字符串是不定长的,所以循环条件一般为str[I]!=’\0’ 或I<strlen(str)

3、  而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指针)不能加&。

4、  指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起的灾难性错误。

5、  分不清p和*p。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二级指针或多级指针,取*以后得到的仍然可能是地址。



四、函数

1、 函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号

2、 函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组int a[];的时候,给出的a[]或a[I].

3、  递归时忘了设置边界条件,这样易造成死循环调用。

4、使用函数之前未声明(包括C库函数的声明)。建议大家,将所定义的一切函数都在程序开始的预处理命令后加上函数原型的声明,这样做不仅可以避免错误,而且整个程序的结构看起来更清楚。

五、结构体共用体

1、  结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了birthday)

2、  结构体类型名和结构体变量名混淆。例如:

struct STU

{….

Struct data

{int year,month,day;

}birthday

};

struct STU a; struct STU是类型名称,而且不分配空间,且不能直接引用。只有定义了结构体类型struct STU的变量a以后,才为a分配相应的内存空间,引用时也要是a.???

3、  结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时候。一定要一级一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.birthday.year. 不能直接a.year.

4、  对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对结构体变量整体操作,只能一个成员一个成员地输入、输出。

5、  不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们,并分别按不同类型引用它们。切记:共用体变量不能做函数形参。



六、文件

1、 使用之前没有打开文件,使用之后没有关闭文件。

2、  相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数声明)的一致
全部回答
其实我想说,我懂你的程序的意思。union是联合体,但是这个执行的结果看编译器的,VC6编译器认为int是占4个字节的,联合体k和数组i的首地址是相同的,但i只有2个字节。所以,在VC6环境下,前两个字节是确定的内容(已被你赋值),后两个字节是未知的,所以执行结果不确定。如果在TC2中,int好像是2个字节,那么执行结果是确定的。十六进制39对应二进制为c语言类型转换的根本原则是必须保证数据不能丢失!在这个基础上,总结两个基本原则.1.若两种类型的比特数不同,转换成比特数高的类型如:-1 > (unsigned char)1会把(unsigned char)1转换成int型,变成1,表达式的值为false2.若两种类型的比特数相同,且一种有符号,一种无符号,则转换成无符号类型。如:-1 > (unsigned int)1会把int型的-1转换成(unsigned int),变成4294967295,所以表达式的值为真。
表示分配2块大小为20个字节的连续存储空间并进行强制类型转换,p代表首地址...本章小结 结构体与共用体是C语言中两个重要的构造数据类型:前者能将不同类型的数据...
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
朋友想买个笔记本、请问怎么购买?
怎么才能学好韩语和日语
阳光广场月河苑我想知道这个在什么地方
怀孕四个月饮食哪些最好?因为本人不怎么吃下
一个男人跟一个女人该做什么呢?
SHINee会超过5年吗?
led日光灯管电源怎么连接
索爱手机排线问题
这个花腾叫什么名?
天才的智商一般是多少?
现在做什么职业最好?
地下城鬼泣觉醒伤害是与怖拉修刚出来时智力(
谁可以告诉我爱的人该如何去做
黄水小学杨公校区这个地址在什么地方,我要处
北京的四合院值多少钱,四合院建设要多少钱
推荐资讯
怀孕一个多月突然调了
谁用过美加净银杏洗面奶,怎么样啊?超市有卖吗
艺术类考生选什么专业比较好,最好详细点.
Nokia 6500S是不是没有按键光?
有喜欢穿棉船袜的女孩吗?能给个QQ号码吗?
华春副食电器百货怎么去啊,有知道地址的么
Q三國裏的“新戒指”可以釘其他東東嗎?例如
如何使电脑网速变快,怎么使电脑网速变快
孕妇八个月,今天胎动厉害,几乎一天没停
脸上长黑色素怎么办?
我这手机下载不起手机QQ
上大学到底有没有用?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?