【问题标题】:C: explain if(exit(0),0){} line of codeC:解释 if(exit(0),0){} 行代码
【发布时间】:2013-03-08 20:32:37
【问题描述】:

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

这个语句究竟是如何工作的?

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

【问题讨论】:

  • main函数之外它们是不等价的。
  • @ouah 我相信在 main 之外也有 if(exit(0),0) == f(0) 我错了。你的观点是什么
  • @GrijeshChauhan 我的观点是return 0 从函数返回,而exit(0) 从程序退出:这不是同一个操作。
  • @ouah ahaa :) 愚蠢的问题。是的,真的,明白了..
  • return 是一个语句,所以不能没有分号使用。函数是一个表达式,所以不需要。

标签: c exit


【解决方案1】:

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

exit(0), 0

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

exit(0);
if (0) {}

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

【讨论】:

  • 逗号运算符是少数指定操作数计算顺序的运算符之一。在第一个参数的评估之后有一个序列点,甚至。
  • ,指定的顺序计算其操作数:先左后右。
  • exit(0),0返回 0。它的计算结果为 0。也许是语义上的琐事,但这里没有返回。
  • 这不仅仅是为了“防止警告”,而是为了避免违反约束。由于exit 具有返回类型void,因此它不能用作if 语句的控制表达式。 ,0 与表达式的 value 无关,反正也不会用到。这是为了给表达式正确的type
  • @R.. 我说的代码相当于没有exit(0)作为if的条件表达式,它在if之前。
【解决方案2】:

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

但要回答您的问题,当您有多个用逗号分隔的语句时,“结果”是最后一个语句。 if 需要一些带有值的语句来评估,并且由于 exit() 是无效的,它没有任何价值。逗号后面的 0 提供了 if 的值。

【讨论】:

  • 我没有偏离 - 只是从 K&R 的练习中休息一下。
【解决方案3】:

当你写作时

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

【讨论】:

    【解决方案4】:

    这只是 comma operator

    表示返回运算符右边的值,对左边的部分求值。

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

    【讨论】:

    • 有一个昏迷运算符会很有趣。
    • 一瓶伏特加就行了。
    【解决方案5】:

    在正常编程中,逗号操作符可以被视为与; 相同的效果。实际上,在这种情况下,if 中的每个表达式都会被计算。但是只要调用exit(),程序就会终止。有关逗号运算符的详细信息,请关注此Link

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2011-05-01
      • 1970-01-01
      • 2012-12-10
      相关资源
      最近更新 更多