xp ? *xp : 0这个语句是不能被编译成条件传送语句的。因为如果是条件传送语句,那么不论xp为什么,*xp都会被计算。
我们要写一个和该功能完全一样的能编译成条件传送语句的函数。
于是,我们要想办法不使用*xp,而使用一个替代的指向0的非空指针。
int cread_alt(int *xp)
{
int t = 0;
int *p = xp?xp:&t;
return *p;
}
6.23
设半径为r的磁盘总的磁道是K
如上图去除的部分x*r的磁道数为x*K
那么剩下的磁道数为 (1-x)*K
所以总容量为 2*pi*x*r*(1-x)*K (其中pi,r和K都是常数)
也就是对x*(1-x)进行判断
可以得出x = 0.5的时候取最大
6.24
6.26
可以由以下公式计算得出
10.6
Unix进程打开的描述符赋给了stdin(描述符0)、stdout(描述符1)和stderr(描述符2)。
open函数总是返回最低的未打开的描述符,所以第一次调用open函数会返回描述符3即是fd1=3
第二次调用open函数则会返回描述符4即是fd2=4
关闭fd2之后再打开fd2仍是4
8.9
解:如图中所画的坐标轴可以比较容易的看出
AB之间没有交集所以不是并行,而其他的有交集所以是并行。
8.11
解:
∵Fork()函数的作用是调用一次返回两次
∴当 i = 0 时,输出2个hello
当 i = 1 时,输出2个hello
当 i = 2 时,条件不满足跳出循环
∴输入4个hello
8.12
解:如图 定义一个doit()里包含了两个Fork(),返回4次所以输出4个hello
main函数中调用了doit()函数所以又输出4个hello
∴最后一共输出8个hello
分数汇总:3+2+1+1+1+1+1+1+1 =12 =10分