我正在学习 C,作为练习,我正在尝试编写一个没有任何分号的简单程序。我在替换return 0
语句时遇到了一些麻烦,但我发现这是(唯一的?)在 C: 中执行此操作的方法if(exit(0),0){}
。
这个声明究竟是如何工作的?
我知道exit()
fromstdlib
是一个 void 函数,但我不明白工作,0
中的部分if
(其余部分对我来说很清楚)。
C 中的,
运算符计算它的两个参数,并返回第二个参数的值。所以表达式
exit(0), 0
调用exit(0)
并返回 0。因此,您发布的代码实际上等效于:
exit(0);
if (0) {}
但是,exit()
应该终止进程,所以这永远不会真正返回。该成语只是用于防止虚假的编译器警告。
在学习 C 时,弄清楚如何编写没有分号的程序没有任何价值。听起来你已经偏离了学习 C 的方向,转而玩无用的把戏。
不过,要回答您的问题,当您有多个用逗号分隔的语句时,“结果”是最后一个语句。if
需要一些带有值的语句来评估,因为exit()
它是无效的,所以它没有价值。逗号后面的 0 为if
.
当你写
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
。
这只是逗号运算符。
这意味着返回运算符的右侧值,并评估左侧部分。
在这种情况下,使用它exit()
可以将 0 放入if
语句中,并将 0 作为参数传递以在if
语句中进行检查(它不能用于 void 值)。
逗号运算符可以被视为与;
正常编程中相同的效果。实际上在这种情况下,内部的每个表达式if
都将被评估。但是无论何时exit()
调用该程序都会终止。有关逗号运算符的详细信息,请点击此链接