繁体   English   中英

将 if-else 替换为?: 在 c++

[英]Replace if-else with ?: in c++

原始代码是:

if (expression1) statement1;
    else statement2;

有没有可能把它变成这个?

expression1 ? statement1 : statement2

还是取决于编译器? 似乎这在 c++ 标准中有所不同?

有时情况是if (expression1) statement1; 我怎样才能改变它?

顺便说一句,它可以在 c 中完成。

使源代码不可读正是我想要做的
这只是其中一个步骤

error: second operand to the conditional operator is of type 'void', but the third operand is neither a throw-expression nor of type 'void'
这就是我在编译时使用g++ (TDM-2 mingw32) 4.4.1得到的

#include <stdio.h>

void _(int __, int ___, int ____, int _____)
{
    ((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ?     _(__,___+_____,___ % __, _____) :
    ((___ % __)==(___ / __) && !____) ? (printf("%d\n",(___ / __)),
    _(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
    _(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
    _(__,___+_____,____,_____) : 0;
}

int main() {
    _(100,0,0,1);
    return 0;
}

如果我用throw 0替换最后一个 0 ,它将成功编译。

expression1? statement1: statement2 expression1? statement1: statement2这实际上是不正确的。 正确的是这样:

expression1? expression2: expression3

并非任何语句都可以等效地转换为单个表达式,因此通常并非总是可能的。 例如:

if(expr)
{
   for(int i = 0; i < 2; ++i) {std::cout << i; }
}
else
{ 
   //something else
}

您不能将其转换为?:表达式,因为for是语句,而不是表达式。

顺便提一句。 它不能在标准 C 中完成。 您所指的可能是语句表达式,它是 GCC 扩展。

如果你可以转换单曲

if (expression1) expression2;

以这种方式使用 (void(0)) 的技巧

expression1 ? expression2 : (void(0)) ;

但我不建议这样做/使用它!

? : ? :可能导致意大利面条代码并尽量避免它。 最好有清晰易读的代码。

此外,两种方式的代码都是相同的,并且没有特殊的理由来制作难以阅读的代码。

使源代码不可读正是我想要做的

为什么? 您唯一会影响到的人是您的代码的维护者。 如果您试图阻止黑客理解您的代码,请不要打扰。 他们知道书中的每一个技巧,以及书中没有的一些技巧。

编码:

expression1 ? statement1 : statement2

在 C++ 中的工作方式与在 (GCC) C 中的工作方式相同。

编码:

if (expression1) statement1;

已经是 go 一样简单的事情了。 为什么你甚至想改变这个?

除了Armen的回答,可能会提到C语法将语句定义为以下之一:labeled_statement、compound_statement、expression_statement、selection_statement、iteration_statement和jump_statement。 在所有这些中,只有表达式语句实际上是一个表达式。

与?:问题无关,但我认为用双下划线定义您自己的标识符或在全局命名空间中以下划线开头的标识符是不合法的 - 请参阅此问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM