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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值