3

我正在学习 C,作为练习,我正在尝试编写一个没有任何分号的简单程序。我在替换return 0语句时遇到了一些麻烦,但我发现这是(唯一的?)在 C: 中执行此操作的方法if(exit(0),0){}

这个声明究竟是如何工作的?

我知道exit()fromstdlib是一个 void 函数,但我不明白工作,0中的部分if(其余部分对我来说很清楚)。

4

5 回答 5

6

C 中的,运算符计算它的两个参数,并返回第二个参数的值。所以表达式

exit(0), 0

调用exit(0)并返回 0。因此,您发布的代码实际上等效于:

exit(0);
if (0) {}

但是,exit()应该终止进程,所以这永远不会真正返回。该成语只是用于防止虚假的编译器警告。

于 2013-03-08T20:38:36.993 回答
5

在学习 C 时,弄清楚如何编写没有分号的程序没有任何价值。听起来你已经偏离了学习 C 的方向,转而玩无用的把戏。

不过,要回答您的问题,当您有多个用逗号分隔的语句时,“结果”是最后一个语句。if需要一些带有值的语句来评估,因为exit()它是无效的,所以它没有价值。逗号后面的 0 为if.

于 2013-03-08T20:38:02.133 回答
2

当你写

int i = (5, 7);

i 分配7 5

括号中,分隔的表达式从 LHS 执行到 RHS。

同样if(exit(0), 0) == if(0),但exit(0) 先执行。(不优化为空白

我的以下示例及其输出将在一定程度上帮助您了解其行为:

#include<stdio.h>
int fun(char* c){
 printf("%s\n", c);
 return 0;
}
int main(){
 int i = (fun("1"),fun("2"));
 if(fun("3"),7){
   printf("ONE %d", i);
 }
 else{
  printf("TWO %d", i);
 }
}

其输出:

1
2
3
ONE 0

特别注意ONE最后打印的输出0,因为在if(fun("3"),7) == if(7). 否则fun()返回0

于 2013-03-08T20:49:09.507 回答
1

这只是逗号运算符

这意味着返回运算符的右侧值,并评估左侧部分。

在这种情况下,使用它exit()可以将 0 放入if语句中,并将 0 作为参数传递以在if语句中进行检查(它不能用于 void 值)。

于 2013-03-08T20:43:57.613 回答
0

逗号运算符可以被视为与;正常编程中相同的效果。实际上在这种情况下,内部的每个表达式if都将被评估。但是无论何时exit()调用该程序都会终止。有关逗号运算符的详细信息,请点击此链接

于 2013-03-08T20:39:45.683 回答