emc的4道面试题自解

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

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据