трюк с ++ - PullRequest
       21

трюк с ++

1 голос
/ 25 ноября 2011

В c / c ++, если функция логическая, вы можете сделать трюк, подобный этому

function1() || function2();

, поэтому, если функция1 () не работает, функция2 () запускается.Я помню, что есть хитрость, чтобы сделать что-то вроде

function() || return false;

Но «вернуть ложь» не дает результата обратно.Подобные вещи распространены в других языках, таких как Perl.

Вопрос

function() || (x);

что я положил в х, чтобы я получил эквивалент

if(function()==false)
    return false;

Редактировать

Я не собираюсь выбирать ответ и позволять голосам поднимать настроение.В любом случае вот решение:

сначала положите это куда-нибудь

#define treturn(x) ({return (x); 1;})

И теперь вы можете сделать это

function() || treturn(false)

или вернуть то, что вам нравится.Где возвратная часть происходит, только если function () == false.И вы можете использовать «&&» aswell

function() && treturn(false)

. В этом случае произойдет возврат, когда функция () == true.

Примечание Как уже упоминали многие люди,Ты не должен этого делать.И ds27680 выложил хорошую альтернативу

Ответы [ 4 ]

4 голосов
/ 25 ноября 2011

Я пытаюсь выяснить, где "трюк". В C ++ операторы || и && определены как короткие замыкания, и это стандартная практика использовать их как таковые, например, для таких вещей, как:

return p == NULL || *p == '\0';

Конечно:

return function() || return false;

незаконно - это возможно в Perl, где это одна из вещей которые делают Perl языком только для записи.

return function() || false;

законно, синтаксически, но бессмысленно; это точный эквивалент:

return function();

И ваш последний пример должен быть написан:

if ( !function() ) {
    return false;
}

. Или, скорее, с чем-то вроде:

bool retval = true;
if ( function() ) {
    //  ...
    retval = ...
}
return retval;

Зачем запутывать, когда это можно прояснить?

3 голосов
/ 25 ноября 2011

Возможно, это не тот ответ, который вы действительно ищете, но я думаю, что лучше сделать это:

return function();

... или, если вы чувствуете себя многословно:

if( function() )
  return true;
else 
  return false;

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

РЕДАКТИРОВАТЬ: Если вы хотите вернуть * 1009, следуйте вашим комментариям здесь.* если функция оценивается как false или продолжить выполнение, если она оценивается как true, тогда не может быть более простого, более производительного или более простого в обслуживании способа, чем:

if( !function() )
  return false;

/*
 * MAGIC HAPPENS!
 */

EDIT2: Если вы пытаетесь избежать нескольких точек возврата, просто:

if( function() )
{ 
  /*
   * MAGIC HAPPENS!
   */
}
1 голос
/ 25 ноября 2011

Простейшим способом получить эквивалент:

if(function()==false)
    return false;

будет:

return function();

: -)

Теперь серьезно ... иответьте на комментарии, если у вас есть код после if, то, по моему скромному мнению, вы уже написали форму, с которой большинство разработчиков C ++ не будут иметь проблем с читаемостью (для полноты):

if(function()==false)
    return false; 

или:

   if ( !function() )
      return false; 

Все остальное, по моему мнению, либо невозможно, либо имеет сомнительную ценность ...

1 голос
/ 25 ноября 2011

В случае просто false return function()

Else

return function() || function2()

Но будьте осторожны, я не уверен, определен ли порядок оператора OR.

Если это так, и функция () возвращает true, функция2 () не оценивается.

...