你为什么要回来(0*ap ++)?

Joe*_*oey 6 c

这是K&R-C,这里是整个代码:http://v6shell.org/history/if.c

看看这个功能:

char *nxtarg() {
    if (ap>ac) return(0*ap++);
    return(av[ap++]);
}
Run Code Online (Sandbox Code Playgroud)

1.问题: 为什么要返回(0*ap ++)?好的,你想要返回0并将ap增加1.但为什么会这样?比它快if (ap>ac) {ap++; return 0;}吗?

2.Question:nxtarg的返回类型必须是char*,为什么你能返回0,一个整数?

das*_*ght 7

这是一个将增量压缩到返回零的语句的小技巧.它在逻辑上等同于条件

if (ap > ac) {
    ap++;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用逗号运算符甚至更好:

return (ap++, (char *)0); // Thanks, Jonathan Leffler
Run Code Online (Sandbox Code Playgroud)

请注意,由于示例中的零不是编译时常量,因此表达式需要强制转换才能符合标准:

if (ap>ac) return (char*)(0*ap++);
Run Code Online (Sandbox Code Playgroud)

就返回整数零而言,NULL当在指针上下文中使用时,它被认为等于指针.

  • 我观察到GCC(4.9.2测试),对象返回(ap ++,0);`with'返回使得整数指针没有强制转换'.在Linux上,这可以通过使用NULL(`#define NULL((void*)0)`)或者在0.之前添加`(char*)`强制转换来修复.因为简单的`return 0;`工作良好; 对我来说,为什么表达式会收到警告并且简单的返回没有显示,这并不是100%明显的. (3认同)