1.int main() {
fork();
fork()&&fork()||fork();
fork();
}
问:共创建了多少进程?
这道题我第一个映像就是短路求值,然后又想到了几何级数,以及fork函数,fork后还有fork
我的答案是20-1=19。前边的20是进程总数,后边-1是创建进程数
第一个fork完后共用2个进程(ID=1,ID=2),第二个fork,当返回值为0时,即子进程时,直接调用倒数第二个fork,于是ID=1,ID=2分别调到第二个fork,然后各调到倒数第二个fork,共形成了8个进程
第二个fork不为0时,即进程为母进程或第一个子进程时,则要看第二个fork如果第二个fork也不为0的话,则不用考虑第三个进程,最先存在两个进程调用最后的fork,然后形成了4个进程
第二个fork!=0,第三个为0时,则需要调用后边两个fork,则为2X2X2=8
所以除去最开始的进程,一共创建19个进程
2.#define NELE(a) (sizeof(a) / sizeof(a[0]))
int main() {
char str[] = {‘E’, ‘M’, ‘C’};
for (int d=-1; d<=(NELE(str)-2);d++)
printf("%c",str[d+1]);
return 0;
}
问:输出结果
什么都没输出,根据C99文档,sizeof是无符号的数,当表达式中出现了个无符号的数时,所有有符号转化成无符号,则-1将变成一个巨大的值,那么直接return了
3.int i=1;
printf("%d,%d\n",sizeof(i++),i);
问:输出结果
4,1
sizeof()在编译前就处理了,因此sizeof(xxx)就是求的是int的大小,而++被忽略了。。。
4.#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main() {
printf("%s\n",g(f(1,2)));
printf("%s\n",h(f(1,2)));
return 0;
}
问:输出结果
12
ascii12代表字符
a##b字符12
#define g(a) #a引用字符12
#define h(a) g(a) g(a)被字符12代替,然后理解为了数字12