Компактная заменa &&
От: Draqon  
Дата: 12.03.06 05:21
Оценка: :)
Есть функции foo() и bar().
Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
Пока придумалось такое:
return foo() ? bar() : (bar(), false);
Re: Компактная заменa &&
От: ned Австралия  
Дата: 12.03.06 05:58
Оценка: +1
Здравствуйте, Draqon, Вы писали:

return foo() & bar();

Проще некуда.
Re[2]: Компактная заменa &&
От: Draqon  
Дата: 12.03.06 06:16
Оценка:
Здравствуйте, ned, Вы писали:

ned>
ned>return foo() & bar();
ned>

ned>Проще некуда.

Вот только порядок следования вызовов переворачивать не хочется — имхо, читабельность страдает.
Re: Компактная заменa &&
От: Шахтер Интернет  
Дата: 12.03.06 11:44
Оценка: 4 (1) -1
Здравствуйте, Draqon, Вы писали:

D>Есть функции foo() и bar().

D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
D>Пока придумалось такое:
D>
D>return foo() ? bar() : (bar(), false);
D>



/* main.cpp */ 

#include <iostream>

using namespace std;

struct WarmBool
 {
  bool value;
  
  WarmBool(bool value_) : value(value_) {}
  
  WarmBool operator && (bool x) const { return value && x ; }
  
  WarmBool operator || (bool x) const { return value || x ; }
 };

/* main() */   

bool foo()
 {
  cout << "foo()\n" ;
  
  return false;
 }
 
bool bar()
 {
  cout << "bar()\n" ;
  
  return false;
 } 
 
int main()
 {
  foo() && bar() ;
  
  (WarmBool)foo() && bar() ;
 
  return 0;
 }
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re: Компактная заменa &&
От: Erop Россия  
Дата: 12.03.06 13:13
Оценка: 1 (1) +2
Здравствуйте, Draqon, Вы писали:

D>
D>return foo() ? bar() : (bar(), false);
D>



Я бы всё-таки так наверное написал:

    bool foo_res = foo();
    return bar() && res;


Это если порядок важен. Всё-таки мне кажется, что главная ценность в коде -- сделать так, чтобы программист читатель не думал "зачем же так круто-то запрограммировали? " А код с "?" -- всё-таки очень нестандартный
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Компактная заменa &&
От: NoFate Россия  
Дата: 12.03.06 13:34
Оценка:
Здравствуйте, ned, Вы писали:

ned>Здравствуйте, Draqon, Вы писали:


ned>
ned>return foo() & bar();
ned>

ned>Проще некуда.

Оффтоп, конечно, но вот скажите дурачку, если foo() вернет false, выполнится ли bar()?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Компактная заменa &&
От: ned Австралия  
Дата: 12.03.06 13:56
Оценка:
Здравствуйте, NoFate, Вы писали:

NF>Оффтоп, конечно, но вот скажите дурачку, если foo() вернет false, выполнится ли bar()?


Да. Для обычных (не логических) операций всегда вычисляются оба операнда.
Re[3]: Компактная заменa &&
От: Draqon  
Дата: 12.03.06 14:16
Оценка:
Здравствуйте, NoFate, Вы писали:

NF>Оффтоп, конечно, но вот скажите дурачку, если foo() вернет false, выполнится ли bar()?


Так отож...
Во-первых, у операторов & и | порядок вычисления аргументов не гарантирован ([expr]). Например, MSVC вычисляет их справа налево, правда оба.
Кстати, это я только сейчас в стандарт полез. Вообще, этот факт делает решение проблемы с помощью & неактуальным, поскольку обе функции имеют side-effects и порядок следования важен.
Да, относительно самого вопроса: я не нашёл в стандарте прямого запрещения компилятору соптимизировать вызов foo() & 0 до константы 0. Если кто знает, ткните меня носом, плз.
Re[4]: Компактная заменa &&
От: Draqon  
Дата: 12.03.06 14:35
Оценка:
Здравствуйте, ned, Вы писали:

ned>Да. Для обычных (не логических) операций всегда вычисляются оба операнда.


А где это "всегда" в стандарте написано, не подскажете?
Re: Компактная заменa &&
От: Olegator  
Дата: 12.03.06 23:52
Оценка: 4 (3) +2
Здравствуйте, Draqon, Вы писали:

D>Есть функции foo() и bar().

D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?

bool fooRes = foo();
bool barRes = bar();

return (fooRes && barRes);
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: Компактная заменa &&
От: ned Австралия  
Дата: 13.03.06 07:45
Оценка:
Здравствуйте, Draqon, Вы писали:

ned>>Да. Для обычных (не логических) операций всегда вычисляются оба операнда.

D>А где это "всегда" в стандарте написано, не подскажете?

Явное указание сходу не нашел, но полагаю, что если иное поведение в стандарте не описано (как для AND и OR), то предполагается что будут вычислены оба операнда.
Re[4]: Компактная заменa &&
От: ned Австралия  
Дата: 13.03.06 07:49
Оценка:
Здравствуйте, Draqon, Вы писали:

D>Да, относительно самого вопроса: я не нашёл в стандарте прямого запрещения компилятору соптимизировать вызов foo() & 0 до константы 0. Если кто знает, ткните меня носом, плз.


Подобная оптимизация нелогична. Тогда уж можно вообще не вызывать функции, возвращаемое значение которых нигде не сохраняется.
Re: Компактная заменa &&
От: Sm0ke Россия ksi
Дата: 13.03.06 08:12
Оценка: -1
Здравствуйте, Draqon, Вы писали:

D>Есть функции foo() и bar().

D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
D>Пока придумалось такое:
D>
D>return foo() ? bar() : (bar(), false);
D>



Можно так:
#define AND(a, b)  ( (a)?(b):((b),false) )

return AND(foo(), bar());

Или:
#define AND(a, b)  ( ((bool)a)?((bool)b):(((bool)b),false) )
Re[2]: Компактная заменa &&
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 13.03.06 08:29
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Здравствуйте, Draqon, Вы писали:


D>>Есть функции foo() и bar().

D>>Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
D>>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?

O>
O>bool fooRes = foo();
O>bool barRes = bar();

O>return (fooRes && barRes);
O>


Полностью согласен.
Как писал Francis Glassborow в CVu 17.6:

FG>I contend that anyone who believes that the following code is safe and guaranteed to

FG>output 5 is not qualified to write guidelines for use of C in safety critical contexts.
FG>
FG>#include <stdio.h>
FG>int main(){
FG>  int i = 2;
FG>  int j = (i++) + (i++); /* A */
FG>  printf("%d", j);
FG>  return 0;
FG>}
FG>
Re[5]: Компактная заменa &&
От: kan_izh Великобритания  
Дата: 13.03.06 09:06
Оценка:
ned wrote:

> D>Да, относительно самого вопроса: я не нашёл в стандарте прямого

> запрещения компилятору соптимизировать вызов foo() & 0 до константы 0.
> Если кто знает, ткните меня носом, плз.
Трудно сказать, будем исходить из "разумности стандарта".

> Подобная оптимизация нелогична. Тогда уж можно вообще не вызывать

> функции, возвращаемое значение которых нигде не сохраняется.
Почему бы и нет, в случае если компилятор точно знает, что функция не производит никаких сторонних эффектов.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Компактная заменa &&
От: Шахтер Интернет  
Дата: 13.03.06 09:58
Оценка:
Здравствуйте, Draqon, Вы писали:

D>Здравствуйте, NoFate, Вы писали:


NF>>Оффтоп, конечно, но вот скажите дурачку, если foo() вернет false, выполнится ли bar()?


D>Так отож...

D>Во-первых, у операторов & и | порядок вычисления аргументов не гарантирован ([expr]). Например, MSVC вычисляет их справа налево, правда оба.
D>Кстати, это я только сейчас в стандарт полез. Вообще, этот факт делает решение проблемы с помощью & неактуальным, поскольку обе функции имеют side-effects и порядок следования важен.

В таком случае единственное решение

bool ret_foo=foo();
bool ret_bar=bar();

return ret_foo && ret_bar;
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: Компактная заменa &&
От: s.ts  
Дата: 15.03.06 19:22
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я бы всё-таки так наверное написал:


E>
E>    bool foo_res = foo();
E>    return bar() && res;
E>


E>Это если порядок важен. Всё-таки мне кажется, что главная ценность в коде -- сделать так, чтобы программист читатель не думал "зачем же так круто-то запрограммировали? " А код с "?" -- всё-таки очень нестандартный


Удивительно, что только один человек высказал столь правильную мысль.

Я же голосую за еще более тривиальное:

bool foo_result = foo();
bool bar_result = bar();
return foo_result && bar_result;
Re[3]: Компактная заменa &&
От: Erop Россия  
Дата: 15.03.06 21:19
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>
ST>bool foo_result = foo();
ST>bool bar_result = bar();
ST>return foo_result && bar_result;
ST>


Я, в принципе, тоже
Просто там просили покомпактнее
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Компактная заменa &&
От: remark Россия http://www.1024cores.net/
Дата: 15.03.06 21:27
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, s.ts, Вы писали:


ST>>
ST>>bool foo_result = foo();
ST>>bool bar_result = bar();
ST>>return foo_result && bar_result;
ST>>



Я тоже за такой вариант — будет понятно хотя бы что происходит


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Компактная заменa &&
От: Дядюшка Че Россия  
Дата: 07.04.06 14:47
Оценка:
Здравствуйте, Sm0ke, Вы писали:
S>#define AND(a, b)

Ох уж эти мне макросы!!!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Компактная заменa &&
От: chem  
Дата: 07.04.06 15:53
Оценка:
Здравствуйте, Draqon, Вы писали:

D>Есть функции foo() и bar().

D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
D>Пока придумалось такое:
D>
D>return foo() ? bar() : (bar(), false);
D>


Придумалось такое :

struct MyANDProxy
{
    MyANDProxy( bool bResult ) : m_bResult( bResult )
    {
    }

    bool operator > ( bool bRightResult )
    {
        return m_bResult && bRightResult;
    }
    
    bool m_bResult;
};

struct MyAND
{
};

MyANDProxy operator < ( bool bLeftResult, MyAND and )
{
    return MyANDProxy( bLeftResult );
}

MyAND and;


Использование:
return foo() <and> bar();




П.С. Просьба ногами не бить — это лишь демонстрация концепта, нагло сдертая из статьи в кудже.
Re: Компактная заменa &&
От: Olivan Россия  
Дата: 07.04.06 23:48
Оценка: 3 (1)
Здравствуйте, Draqon, Вы писали:

    return foo() >>! bar();


Re[3]: Компактная заменa &&
От: Hasmik Армения  
Дата: 08.04.06 06:31
Оценка:
A>Полностью согласен.
A>Как писал Francis Glassborow в CVu 17.6:

FG>>I contend that anyone who believes that the following code is safe and guaranteed to

FG>>output 5 is not qualified to write guidelines for use of C in safety critical contexts.
FG>>
FG>>#include <stdio.h>
FG>>int main(){
FG>>  int i = 2;
FG>>  int j = (i++) + (i++); /* A */
FG>>  printf("%d", j);
FG>>  return 0;
FG>>}
FG>>

Грубо высказался товарищщ. Надо было "is not qualified to write guidelines to those who writes guidelines...{n раз} for use of C in safety critical contexts.
Re[5]: Компактная заменa &&
От: VoidEx  
Дата: 08.04.06 13:47
Оценка:
Здравствуйте, Draqon, Вы писали:

D>Здравствуйте, ned, Вы писали:


ned>>Да. Для обычных (не логических) операций всегда вычисляются оба операнда.


D>А где это "всегда" в стандарте написано, не подскажете?

Да пожалста...
5.14 Logical AND operator [expr.log.and]
logical-and-expression:
inclusive-or-expression
logical-and-expression && inclusive-or-expression
1 The && operator groups left-to-right. The operands are both implicitly converted to type bool (clause 4).
The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right
evaluation: the second operand is not evaluated if the first operand is false.
Re[6]: Компактная заменa &&
От: VoidEx  
Дата: 08.04.06 13:48
Оценка:
Упс, сорри, забыл страницу перелистнуть и ответил
Re[2]: Компактная заменa &&
От: VoidEx  
Дата: 08.04.06 16:32
Оценка:
Здравствуйте, Olivan, Вы писали:

O>Здравствуйте, Draqon, Вы писали:


O>
O>    return foo() >>! bar();
O>


O>

Гыы, круто)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.