C语言中IF-ELSE语句的快捷方式

21

在C语言中,使用以下语法可以快速实现IF-ELSE语句的缩写形式:

    (integer == 5) ? (TRUE) : (FALSE);
我经常发现自己只需要语句中的一个部分(TRUE或FALSE),并使用它。
    (integer == 5) ? (TRUE) : (0);

我只是想知道是否有一种方法可以使用这种简写标记而不包括ELSE部分?


这在C语言中绝对可行,并且可以使用gcc编译。 - sherrellbc
2
return语句绝对不能放在表达式中。 - user149341
5
?: 不是简写的 IF-ELSE 语句,而是一个操作符。参考例如:https://dev59.com/9nbZa4cB1Zd3GeqPGoJm#18638981 - Paul R
@PaulR,感谢您澄清这一点。尽管该页面上至少有一个人将其称为简写if-else和三元运算符。 - sherrellbc
1
这是一个常见的误解。有一些情况下,你可以用 ?: 表达式替换 if/else,但这只是一个有限的子集。 - Paul R
显示剩余3条评论
2个回答

17

运算符?:必须返回一个值。如果你没有“else”部分,在布尔表达式为false时它会返回什么呢?在其他一些语言中,合理的默认值可能是null,但在C语言中可能不是。如果你只需要执行“if”,而不需要它返回一个值,那么直接使用if语句就更加简便。


谢谢!这就是我想问的。我只是在想是否有一种方法可以不实现任何部分,如果你关心的只是当条件以某种方式评估时,否则什么也不做。虽然,在使用此语句进行赋值的情况下,我认为这是有道理的。如果情况是错误的,那么就没有定义的赋值。 - sherrellbc
gcc允许某种特殊情况,但这是一种非标准扩展。例如retval = retval ?: desc.error; - 请参见https://dev59.com/02sz5IYBdhLWcg3wj4kc - Paul R
@PaulR 我记得在某个地方看到过这个,但我从未深入研究过。它似乎并不是很有用。 - Jeremy
不,这只是比if语句稍微更紧凑一点,但我倾向于避免使用非标准扩展,因为我的代码需要可移植性。 - Paul R

11

问题在于我们是否可以在不使用 then 和 else 部分的情况下编写以下表达式

(integer == 5) ? (THENEXPR) : (ELSEEXPR);
如果只需要 "then" 部分,您可以使用 &&:
(integer == 5) && (THENEXPR)
如果你只需要else部分,使用||运算符:
(integer == 5) || (ELSEEXPR)

对于后者,必须明确的是,“其他情况”不会进行任何赋值操作。在我的情况下,我正在寻找是否有可能缩短 int number=0; integer =2; number = (integer == 5) ? ( then reset ) : ( keep whatever )。但是 number 仍然是0。 - CanO
如果作为赋值的右值,则必须进行赋值,因此表达式的“其他情况”将被评估,并将快捷条件的值分配为:|| 为1,&& 为0。作为“简写IF-ELSE语句”(OP查询),该值将被丢弃,并且赋值应成为then部分和/或else部分的一部分(哪个存在)。或者您可以使用n =(i == 5)?0:n,但是为什么不只是说if(i == 5)n = 0;这很简短(即使是单个字符变量也更短)。 - David M W Powers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接