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

问题描述 投票:0回答:7

原代码为:

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

c++ syntax g++
7个回答
9
投票

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


3
投票

可以改造单if

if (expression1) expression2;

用 (void(0)) 这样的技巧

expression1 ? expression2 : (void(0)) ;

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

? :
会导致意大利面条代码,尽量避免。最好有清晰易读易懂的代码

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


1
投票

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

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


0
投票

代码:

expression1 ? statement1 : statement2

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

代码:

if (expression1) statement1;

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


0
投票

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


0
投票

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


0
投票

?: 是一个有趣的运算符.....实际上它只是一种样式选择,但是使用它不会损失可读性。

任何时候你有一个简单的 If/Else 块设置一个二进制变量,这是一个了不起的选择。

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

这可以很容易地转换为?三元运算符。

var = Exp1 ? Exp2 : Exp3;

Exp1 评估原始 If 语句中的条件。如果 Exp1 为(真),则对 Exp2 求值并成为语句的值,如果 Exp1 为(假),则对 Exp3 求值并成为语句的值。

如果你使用?在 Exp2 和 Exp3 中使用内联函数的三元行长度可能变得难以理解,同时允许您做任何事情,这满足了开头的问题。

大多数情况下,我会保持简短,并在保护语句中使用此运算符来制作超限安全代码。它在视觉上与众不同,我个人认为这极大地增加了可读性。

© www.soinside.com 2019 - 2024. All rights reserved.