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


对于速记IF-ELSE语句,C具有以下语法

    (integer == 5) ? (TRUE) : (FALSE);

我经常发现自己只需要声明的一部分(TRUE或FALSE)并使用它

    (integer == 5) ? (TRUE) : (0);

我只是想知道是否有办法不使用这种速记符号包含声明的ELSE部分?


3857
2017-09-05 21:22


起源

这肯定适用于C并使用gcc编译。 - sherrellbc
该 return 语句绝对不能放在表达式中。 - duskwuff
好的,我只是把它作为一个例子。语法是正确的,我的示例实现是错误的;这不是这个问题的重点。不管怎样,谢谢你。 - sherrellbc
?: 是 不 “速记IF-ELSE声明” - 这是一个 操作者。参见例如 stackoverflow.com/questions/18638915/... - Paul R
@PaulR,谢谢你清理它。虽然它在该页面上被至少一个人称为短手if-else和三元运算符。 - sherrellbc


答案:


运营商 ?: 必须返回一个值。如果你没有“else”部分,当布尔表达式为false时它会返回什么?某些其他语言中的合理默认值可能为null,但可能不适用于C.如果您只需要执行“if”而不需要它返回值,则键入 if 要容易得多。


12
2017-09-05 21:33



谢谢!这就是我所要求的。我只是想知道是否有一种方法可以不实现任何一个部分,如果您关心的是条件评估某种方式,否则什么都不做。虽然,我认为在使用此语句进行赋值的情况下确实有意义。如果案件是假的,那么就没有明确的任务。 - sherrellbc
gcc允许某种特殊情况,但它是非标准的扩展。例如。 retval = retval ?: desc.error;  - 看 stackoverflow.com/questions/7814694/... - Paul R
@PaulR我记得在某处读过,但我从未调查过。它似乎没有用。 - Jeremy
不 - 只是 略 比if语句更紧凑,但我倾向于避免使用非标准扩展,因为我的代码需要是可移植的。 - Paul R


问题是我们是否可以在没有then和else部分的情况下以某种方式编写以下表达式

(integer == 5) ? (THENEXPR) : (ELSEEXPR);

如果你只需要那个部分,你可以使用&&:

(integer == 5) && (THENEXPR)

如果你只需要使用else部分,请使用||:

(integer == 5) || (ELSEEXPR)

2
2017-10-17 23:26



对于后者,必须明确的是,不会对“其他案例”进行任务。就我而言,我在寻找是否有可能缩短 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;这是好的和短的(更短 - 甚至单个char var)。 - David M W Powers