Здравствуйте, Draqon, Вы писали:
D>Есть функции foo() и bar(). D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar(). D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
Это если порядок важен. Всё-таки мне кажется, что главная ценность в коде -- сделать так, чтобы программист читатель не думал "зачем же так круто-то запрограммировали? " А код с "?" -- всё-таки очень нестандартный
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Draqon, Вы писали:
D>Есть функции foo() и bar(). D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar(). D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности? D>Пока придумалось такое: D>
Есть функции foo() и bar().
Требуется выполнить обе и вернуть результат такой же, как foo() && bar().
Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
Пока придумалось такое:
Здравствуйте, 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) )
Здравствуйте, NoFate, Вы писали:
NF>Оффтоп, конечно, но вот скажите дурачку, если foo() вернет false, выполнится ли bar()?
Так отож...
Во-первых, у операторов & и | порядок вычисления аргументов не гарантирован ([expr]). Например, MSVC вычисляет их справа налево, правда оба.
Кстати, это я только сейчас в стандарт полез. Вообще, этот факт делает решение проблемы с помощью & неактуальным, поскольку обе функции имеют side-effects и порядок следования важен.
Да, относительно самого вопроса: я не нашёл в стандарте прямого запрещения компилятору соптимизировать вызов foo() & 0 до константы 0. Если кто знает, ткните меня носом, плз.
Здравствуйте, Draqon, Вы писали:
ned>>Да. Для обычных (не логических) операций всегда вычисляются оба операнда. D>А где это "всегда" в стандарте написано, не подскажете?
Явное указание сходу не нашел, но полагаю, что если иное поведение в стандарте не описано (как для AND и OR), то предполагается что будут вычислены оба операнда.
Здравствуйте, Draqon, Вы писали:
D>Да, относительно самого вопроса: я не нашёл в стандарте прямого запрещения компилятору соптимизировать вызов foo() & 0 до константы 0. Если кто знает, ткните меня носом, плз.
Подобная оптимизация нелогична. Тогда уж можно вообще не вызывать функции, возвращаемое значение которых нигде не сохраняется.
Здравствуйте, Olegator, Вы писали:
O>Здравствуйте, Draqon, Вы писали:
D>>Есть функции foo() и bar(). D>>Требуется выполнить обе и вернуть результат такой же, как foo() && bar(). D>>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности?
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>
ned wrote:
> D>Да, относительно самого вопроса: я не нашёл в стандарте прямого > запрещения компилятору соптимизировать вызов foo() & 0 до константы 0. > Если кто знает, ткните меня носом, плз.
Трудно сказать, будем исходить из "разумности стандарта".
> Подобная оптимизация нелогична. Тогда уж можно вообще не вызывать > функции, возвращаемое значение которых нигде не сохраняется.
Почему бы и нет, в случае если компилятор точно знает, что функция не производит никаких сторонних эффектов.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Draqon, Вы писали:
D>Здравствуйте, NoFate, Вы писали:
NF>>Оффтоп, конечно, но вот скажите дурачку, если foo() вернет false, выполнится ли bar()?
D>Так отож... D>Во-первых, у операторов & и | порядок вычисления аргументов не гарантирован ([expr]). Например, MSVC вычисляет их справа налево, правда оба. D>Кстати, это я только сейчас в стандарт полез. Вообще, этот факт делает решение проблемы с помощью & неактуальным, поскольку обе функции имеют side-effects и порядок следования важен.
E>Это если порядок важен. Всё-таки мне кажется, что главная ценность в коде -- сделать так, чтобы программист читатель не думал "зачем же так круто-то запрограммировали? " А код с "?" -- всё-таки очень нестандартный
Удивительно, что только один человек высказал столь правильную мысль.
Я, в принципе, тоже
Просто там просили покомпактнее
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Draqon, Вы писали:
D>Есть функции foo() и bar(). D>Требуется выполнить обе и вернуть результат такой же, как foo() && bar(). D>Как уважаемый Аll посоветует это записать, чтобы достичь оптимума компактности и читабельности? D>Пока придумалось такое: D>
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.
Здравствуйте, 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.