《C和指针》第三章课后习题解答
1、在你的机器上,字符的范围有多⼤?有哪些不同的证书类型,它们的范围⼜是如何?
答:在main.c⽂件#include <limits.h>,进⼊limits.h⽂件即可看到各个数据类型的最⼤值最⼩值。
2、在你的机器上,各种不同的浮点数的范围是怎样的?
答:同1题。
3.假定你正编写⼀个程序,它必须运⾏于两台机器之上。这两台机器的缺省整型长度并不相同,⼀个是16位,另⼀个是32位。⽽这两台机器的长整型长度分别是32位和64位。程序所使⽤的的有些变量值并不太⼤,⾜以保存于任何⼀台机器的缺省整型变量中,但有些变量的值却较⼤,必须是32位的整型变量才能容纳它。⼀种可⾏的解决⽅案是⽤长整型表⽰所有的值,但在16位机器上,对于那些⽤16位⾜以容纳的值⽽⾔,时间和空间的浪费不可⼩视。在32位机上,也存在事件和空间的浪费问题。
如果想让这些变量在任何⼀台机器上的长度都合适的话,你该如何声明它们呢?正确的⽅法是不应该在任何⼀台机器中编译程序前对程序进⾏修改。提⽰:试试包含⼀个头⽂件,⾥⾯包含每台机器特定的声明。
答:新建⼀个名为DataType.h的头⽂件,在16位机和32位机上该头⽂件的代码分别如下:
//16位机
typedef unsigned char int8;
typedef int int16;
typedef long int int32;
// 32位机
typedef unsigned char int8;
typedef short int int16;
typedef int int32;
typedef long int int64;
4、假定你有⼀个程序,它把⼀个long整型变量赋值给⼀个short整型变量。当你编译程序时会发⽣什么情况?当你运⾏程序时会发⽣什么情况?你认为其它编译器的结果是否如此?
答:我使⽤的是Visual studio 2012,在上⾯编译和运⾏程序都没有问题。但是控制台显⽰⼀⾏警告信息,提醒可能丢失数据。
警告 2 warning C4244: “=”: 从“long”转换到“short”,可能丢失数据
其它编译器不⼀定会是同样的结果,有的可能编译不通过。
5、假定你有⼀个程序,它把⼀个double变量赋值给⼀个float变量。当你编译程序时会发⽣什么情况?当你运⾏程序时会发⽣什么情况?你认为其它编译器的结果是否如此?
答:和上题⼀样,编译和运⾏程序都没有问题。但是控制台显⽰⼀⾏警告信息,提醒可能丢失数据。
警告 1 warning C4244: “=”: 从“double”转换到“float”,可能丢失数据
6、编写⼀个枚举声明,⽤于定义硬币的值,请使⽤符号PENNY,NICKEL等。
enum MONEY{PENNY=1, NICKEL = 5, DIME = 10, QUARTER = 25}
7、下列代码段会打印出什么东西?
// 题⽬代码
enum Liquid
{
字符串长度不同怎样取OUNCE=1, CUP=8, PINT=16,QUART=32, GALLON=128
};
enum Liquid jar;
jar = QUART;
printf("%s\n",jar);
jar = jar + PINT;
printf("%s\n",jar);
答:上述代码运⾏出错,错误信息如下:
1 IntelliSense: 不能将 "int" 类型的值分配到 "Liquid" 类型的实体
实际上错误的是打印信息的数据格式%s,枚举类型在内存是以整型数据类型存储,打印枚举类型变量应该使⽤整型数据格式%d,把printf ⾥的%s全部改成%d,程序就可以正常运⾏。上述报错信息是因为,C语⾔并不建议对枚举变量进⾏计算,所以报错,但是居然不影响程序运⾏,不知道为啥??修改程序后以及运⾏结果如下:
// 修改代码后
enum Liquid
{
OUNCE=1, CUP=8, PINT=16,QUART=32, GALLON=128
};
enum Liquid jar;
jar = QUART;
printf("%d\n",jar);
jar = jar + PINT;
printf("%d\n",jar);
运⾏结果:
32
48
8、你所使⽤的C编译器是否允许程序修改字符串常量?是否存在编译器选项,允许或禁⽌你修改字符串常量?
答:我使⽤的VS 2012内置编译器,允许我修改字符串常量。且没到这样的编译器选项。
// 修改字符串常量代码
char mychar[] = "hello world";
printf("original string:%s\n",mychar);
mychar[1] = 'h';
printf("changed string:%s\n",mychar);
运⾏结果:
original string:hello world
changed string:hhllo world
9、如果整数类型在正常情况下是有符号类型,那么signed关键字的⽬的何在呢?
答:整数类型分为有符号类型和⽆符号类型,分别⽤signed和unsigned关键字声明。虽然整数类型在缺省情况下默认为有符号型,但signed可以显式定义为有符号类型,语义更清楚。还有万⼀有的编译器整型的默认值不是有符号呢
10、⼀个⽆符号变量可不可以⽐相同长度的有符号变量容纳更⼤的值?
答:我认为⽆符号变量⽐相同长度的有符号变量容纳更⼤的值是必然的,相同长度下,有符号数的最⾼位是符号位,其它位是数据位,⽽⽆符号数的所有位都是数据位,所以⽆符号数的最⼤值总是有符号数最⼤值的2倍+1。
11、加⼊int和float类型都是32位长,你觉得哪种类型能容纳的值精度更⼤⼀些?
答:int类型只能存储整数,float能存储⼩数,显然float的值精度更⼤⼀些。
12、下⾯是两个代码⽚段,取⾃⼀个函数的起始部分,它们完成任务的⽅式有何不同?
// ⽚段1
int a = 25;
// ⽚段2
int a;
a = 25;
答:它们完成任务的⽅式⽆任何不同,⽚段1和⽚段2的代码是等效的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。