Замените if-else на?: В c ++ - PullRequest
3 голосов
/ 04 июля 2011

Оригинальный код:

if (expression1) statement1;
    else statement2;

возможно ли превратить его в это?

expression1 ? statement1 : statement2

или это зависит от компилятора? кажется, что это отличается в рамках стандартов C ++?

Иногда бывает if (expression1) statement1;, и как мне это преобразовать?

кстати, это можно сделать в ц.

Сделать исходный код нечитаемым - это именно то, что я пытаюсь сделать
Это только один из шагов

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;
}

и если я заменю последний 0 на throw 0, он будет успешно скомпилирован.

Ответы [ 6 ]

8 голосов
/ 04 июля 2011

expression1 ? statement1 : statement2 Это на самом деле неверно. Правильно это:

expression1 ? expression2 : expression3

Ни одно утверждение не может быть эквивалентно преобразовано в одно выражение, поэтому в общем случае это не всегда возможно. Например:

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

Вы не можете преобразовать это в?: Выражение, потому что for это утверждение, а не выражение.

Btw. Это не может быть сделано в стандартном C. То, на что вы ссылаетесь, это, вероятно, выражение оператора , которое является расширением GCC

3 голосов
/ 04 июля 2011

Вы можете преобразовать сингл if

if (expression1) expression2;

с помощью трюка (void (0)) таким образом

expression1 ? expression2 : (void(0)) ;

, но я не предлагаю делатьэто / используйте это!

? : может привести к спагетти-коду и попытаться его избежать.Лучше иметь четкий и легкий для чтения и понимания код.

Кроме того, код одинаков в обоих направлениях, и нет особой причины создавать трудно читаемый код.

1 голос
/ 04 июля 2011

Сделать исходный код нечитаемым - это именно то, что я пытаюсь сделать

Почему?Единственные люди, на которых вы будете влиять, - это сопровождающие вашего кода.Если вы пытаетесь не дать хакерам понять ваш код, не беспокойтесь.Они знают каждый трюк в книге и несколько, которых нет в книге.

0 голосов
/ 04 июля 2011

Не относится к проблеме?:, Но я не думаю, что законно определять ваши собственные идентификаторы с двойным подчеркиванием или идентификаторы, начинающиеся с подчеркиваний в глобальном пространстве имен - см. этот вопрос .

0 голосов
/ 04 июля 2011

В дополнение к ответу Армена можно упомянуть, что грамматика C определяет оператор как одно из следующих: labeleled_statement, component_statement, expression_statement, selection_statement, iteration_statement и jump_statement. Из всех них только выражение-выражение на самом деле является выражением.

0 голосов
/ 04 июля 2011

код:

expression1 ? statement1 : statement2

работает в C ++ так же, как и в (GCC) C.

Код:

if (expression1) statement1;

Уже так просто, как идут дела. Зачем вам это преобразовывать?

...