问题
-
假定你正编写一个程序,它必须运行于两台机器之上。这两台机器的缺省整型长度并不相同,一个是16位,另一个是32位。而这两台机器的长整型长度分别是32位和64位。程序所使用的有些变量的值并不太大,足以保存于任何一台机器的缺省整型变量中,但有些变量的值却较大,必须是32位的整型变量才能容纳它。一种可行的解决方案是用长整型表示所有的值,但在16位机器上,对于那些用16位足以容纳的值而言,时间和空间的浪费不可小视。在32位机器上,也存在时间和空间的浪费问题。
如果想让这些变量在任何一台机器上的长度都合适的话,你该如何声明它们呢?正确的方法是不应该在任何一台机器中编译程序前对程序进行修改。提示:试试包含一个头文件,里面包含每台机器特定的声明答:声明整型变量名,使变量的类型必须有一个确定的长度(如int8、int16、int32)。对于你希望成为缺省长度的整数,根据它所能容纳的最大值,使用类似defint8、defint16或defint32这样的名字。然后为每台机器创建一个名为int_sizes.h的文件,它包含一些typedef声明,为你创建的类型名字选择最合适的整型长度口在一台典型的32位机器上,这个文件将包含:
在一台典型的16位整数机器上,这个文件将包含:
注意:虽然说这里也可以使用#define指令,但是最好不要用,例如:/*typedef char* d_ptr_to_char */ #define d_ptr_to_char char* dptr_to_char a,b;
上面两行语句等价于
char *a,b;
,即正确声明了a,但错误声明了b。如果将宏定义替换为注释代码,那么a和b均可被正确声明。 -
假定你有一个程序,它把一个long整型变量赋值给一个short整型变量。当你编译程序时会发生什么情况?当你运行程序时会发生什么情况?你认为其他编译器的结果是否也是如此?
答:许多编译器都会发出警告信息。标准大致是这样定义运行时行为的:如果要分配的值足够小,可以放入较短的变量中,则保留其值;否则,它依赖于实现。措辞谨慎的描述意味着实现可以简单地丢弃不合适的高阶位,这在大多数机器上提供了最有效的目标代码。这显然是不可移植的。
-
假定你有一个程序,它把一个double变量赋值给一个float变量。当你编译程序时会发生什么情况?当你运行程序时会发生什么情况?
答:编译它时,您可能会收到一条警告消息。运行时行为的定义方式与整数的定义方式大致相同:如果值适合较小的变量,则它有效;否则它依赖于实现。然而,对于浮点值,只有当其指数大于较短类型所能容纳的值时,值才“不适合”。如果指数合适,尾数仍然存在,尾数可能比较短类型所能保持的意义更大。在这种情况下,该值被替换为最接近的值,该值可以在较短的变量中表示;这取决于实现,是循环、截断还是执行其他操作。
-
编写一个枚举声明,用于定义硬币的值。请使用符号PENNY、NICKEL等
答:
-
下列代码段会打印出什么东西?
答:变量jar是一个枚举类型,但它的值实际上是个整数。但是,printf格式代码%s用于打印字符串而不是整数。结果,我们无法判断它的输出会是什么样子。如果格式代码是%也那么输出将会是:32 48
-
一个无符号变量可不可以比相同长度的有符号变量容纳更大的值?
答:否。任何给定的n个位的值只有2"个不同的组合。一个有符号值和无符号值仅有的区别在于它的一半值是如何解释的.在一个有符号值中,它们是负值。在一个无符号值中,它们是一个更大的正值。
-
假如int和float类型都是32位长,你觉得哪种类型所能容纳的值精度更大一些?
答: float的范围比int大,但如果它的位数不比int更多,它并不能比int表示更多不同的值。
前一个问题的答案已经提示了它们应该能够表示的不同值的数量是相同的,但在绝大多数浮点系统中,这个答案是错误的。零通常有许多种表示形式,而且通过使用不规范的小数形式,其他值也具有多种不同的表示形式。因此,float能够表示的不同值的数量比int少。 -
下面是两个代码片段,取自一个函数的起始部分,它们完成任务的方式有何不同?
答:没有不同 -
如果上一个问题中代码片段的声明中包含有const关键字,它们完成任务的方式又有何不同?
答:左边的声明仍然执行以前的操作,但右边的声明有错误;不能为常量变量赋值
-
在一个代码块内部声明的变量可以从该代码块的任何位置根据名字来访问,对还是错?
答:是的,除非嵌套块声明另一个具有相同名称的变量,这会隐藏早期变量并使其无法从嵌套块中访问。
-
假定函数a 声明了一个自动整型变量x,你可以在其他函数内访问变量x,只要你使用了下面这样的声明:
对还是错?答: 错,这些变量永远不能通过名称从其他块访问。
-
假定上一个问题中的变量x被声明为static。你的答案会不会有所变化?
答:不,这会更改其存储类,但不会更改其范围;答案仍然是错误的。
-
假定文件a.c的开始部分有下面这样的声明
如果你希望从不同的源文件的函数中访问这个变量,需不需要添加额外的声明,如果需要的话,应该添加什么样的声明?答:添加如下声明
-
假定上一个问题中的声明包含了关键字static。你的答案会不会有所变化
答:如果声明包含了
static
,那么其他源文件将不可能访问到该变量。 -
假定一个函数包含了一个自动变量,这个函数在同一行中被调用了两次。试问,在函数第2次调用开始时该变量的值和函数第1次调用即将结束时的值有无可能相同?
答:是的,这是可能的,但你不应该指望它。而且,即使不存在其他的函数调用,它们的值
也很可能不同。在有些架构的机器上,一个硬件中断将把机器的状态信息压到堆栈上,它们将破坏
这些变量 -
当下面的声明出现于某个代码块内部和出现于任何代码块外部时,它们在行为上有何不同?
答:内部:变量是自动的,每次调用函数时都会重新初始化,其范围仅限于函数,没有链接。外部:变量是静态的,在程序开始运行之前只初始化一次,它具有文件范围和外部链接 -
假定你想在同一个源文件中编写两个函数x和y,需要使用下面的变量:
你应该怎样编写这些变量?应该在什么地方编写?注意:所有初始化必须在声明中完成,而不是通过函数中的任何可执行语句来完成。答:
-
确认下面程序中存在的任何错误(你可能想动手编译一下,这样能够踏实一些)口在去除所有错误之后,确定所有标识符的存储类型、作用域和链接属性。每个变量的初始值会是什么?程序中存在许多同名的标识符,它们所代表的是相同的变量还是不同的变量?程序中的每个函数从哪个位置起可以被调用?
答:
Note a:如果变量在任何其他声明中都没有初始化,那么它的初始值将为零。
Note b:函数参数的初始值是调用函数时传递的参数。
Note c:extern关键字不会改变第24行中声明的y的链接