Форум программистов, компьютерный форум CyberForum.ru

Зачем компилятору что-то упорядочивать после вычисления второго операнда логического "или"? - C++

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
15.08.2014, 04:51     Зачем компилятору что-то упорядочивать после вычисления второго операнда логического "или"? #1
Стандарт:
5.15 Logical OR operator
[expr.log.or]
logical-or-expression:
logical-and-expression
logical-or -expression || logical-and-expression

1 The || operator groups left-to-right. The operands are both contextually converted to bool (Clause 4). It returns true if either of its operands is true, and false otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates to true.

2 The result is a bool. If the second expression is evaluated, every value computation and side effect associated with the first expression is sequenced before every value computation and side effect associated with the second expression.
То есть: если второй оператор вычислен, вычисление каждого выражения и побочный эффект, связанный с первым выражением упорядочиваются перед вычислением каждого оператора и побочным эффектом второго оператора.

+++++++++++++++++++++++++++++++++++++++++++

Чё за приколы упорядочивать что-то там, если второй оператор уже вычислен и осталось только вернуть его значение? Спасибо, кто откликнется.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2014, 04:51     Зачем компилятору что-то упорядочивать после вычисления второго операнда логического "или"?
Посмотрите здесь:

C++ Обчисление введенной строки любого формата(пример:"(2+3)/4*2"или"2+3"или ...)
Что за подсказки появляются после напечатанного в коде "std" C++
C++ Что после изучения "чистого" C++?
Посоветуйте, что учить после Дейтелей "Как программировать на С++" C++
Объясните что именно делает "x%d, y%d: " или что это в даном коде C++
Что применить "\n" или "endl"? C++
C++ Создать список из целых чисел. После каждого элемента, равного "х" вставить элемент, равный "у"
C++ Что значит ":" после параметров функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
15.08.2014, 05:20     Зачем компилятору что-то упорядочивать после вычисления второго операнда логического "или"? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если второе выражение выполняется (будет выполняться), то все вычисления и побочные эффекты, связанные с первым выражением, следуют перед всеми вычислениями и побочными эффектами, связанными со вторым выражением.

Т.е. гарантируется, что все, что связано с первым выражением гарантировано будет выполнено до выполнения второго и порядок действий не может быть изменен компилятором.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int a = 41;
 
bool f() {
    ++a;
    return false;
}
 
int main() {
    // Гарантируется, что на момент выичсления правого выражения
    // 'a' получит новое значение, после его изменения функцией f.        
    if (f() || a == 42) {
        std::cout << "Ok" << std::endl;
    }
}
Наверное, можно придумать более реалистичный пример.
Yandex
Объявления
15.08.2014, 05:20     Зачем компилятору что-то упорядочивать после вычисления второго операнда логического "или"?
Ответ Создать тему
Опции темы

Текущее время: 11:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru