将if-else替换为?:在C++中

c2e8gylq  于 2023-04-13  发布在  其他
关注(0)|答案(7)|浏览(190)

原始代码为:

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

yh2wf1be

yh2wf1be1#

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扩展。

9lowa7mx

9lowa7mx2#

您可以转换单个if

if (expression1) expression2;

使用(void(0))的技巧如下

expression1 ? expression2 : (void(0)) ;

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

? :可能会导致意大利面条代码,并试图避免它。最好有一个清晰,易于阅读和理解的代码。
此外,代码是相同的两种方式,并没有特别的原因,使一个难以阅读的代码。

s5a0g9ez

s5a0g9ez3#

使源代码不可读正是我要做的
为什么?你唯一会影响的人是你代码的维护者。如果你试图阻止黑客理解你的代码,不要麻烦。他们知道书中的每一个技巧,还有一些书中没有的。

uz75evzq

uz75evzq4#

代码:

expression1 ? statement1 : statement2

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

if (expression1) statement1;

已经很简单了。你为什么还要改变它?

7vux5j2d

7vux5j2d5#

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

dw1jzc5e

dw1jzc5e6#

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

t40tm48m

t40tm48m7#

?:是一个有趣的操作符.....实际上它只是一个样式选择,但是使用它并不会损失可读性。
任何时候你有一个简单的If/Else块设置一个二进制变量,这是一个很好的选择。

If (exp1)
{
var = exp2;
}
else
{
var = exp3;
}

这可以很容易地转换成一个三元运算符。

var = Exp1 ? Exp2 : Exp3;

Exp 1计算原始If语句的条件。如果Exp 1为(true),则Exp 2计算并成为语句的值,如果Exp 1为(false),则Exp 3计算并成为语句的值。
如果你在Exp 2和Exp 3中使用?三进制的内联函数,那么行的长度可能会长得难以阅读,同时允许你做任何事情,这满足了开头的问题。
大多数情况下,我保持简短,并在保护语句中使用这个操作符来生成溢出安全代码。它在视觉上很独特,我个人觉得这大大增加了可读性。

相关问题