在c ++中用if:替换if-else

时间:2011-07-04 15:32:57

标签: c++ syntax g++

原始代码是:

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,它将成功编译。

6 个答案:

答案 0 :(得分:8)

expression1 ? statement1 : statement2这是不正确的。这是正确的:

expression1 ? expression2 : expression3

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

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

你不能将它转换成?:表达式,因为for是一个语句,而不是表达式。

顺便说一下。它不能在标准C中完成。你所指的可能是statement expression这是一个GCC扩展

答案 1 :(得分:3)

您可以转换单个if

if (expression1) expression2;

使用(void(0))这个方法的技巧

expression1 ? expression2 : (void(0)) ;

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

? :可以导致意大利面条代码,并尽量避免使用它。最好有一个清晰易读的代码。

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

答案 2 :(得分:1)

  

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

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

答案 3 :(得分:0)

代码:

expression1 ? statement1 : statement2

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

代码:

if (expression1) statement1;

已经很简单了。为什么你甚至想改变这个?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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