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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
#1

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

15.08.2014, 04:51. Просмотров 187. Ответов 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++
C++ зачем ставить ";"(пустую инструкцию два раза) в цикле for
Что за подсказки появляются после напечатанного в коде "std" C++
C++ Что после изучения "чистого" C++?
Посоветуйте, что учить после Дейтелей "Как программировать на С++" C++
C++ Цикл for: зачем использовать разделитель " ; " два раза?
C++ Программа должна удалять из строки все символы, что стоят на чётных местах после буквы "а"
C++ Что значит ":" после параметров функции
Что лучше для хранения БД в динамической памяти "Связный список" или же просто в массиве? C++
Зачем нужен "stdafx.h" заголовок в Visual Studio C++
Зачем "&" в "ostream& operator<<"? C++
C++ зачем нужна system("pause >nul");

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2451 / 1623 / 238
Регистрация: 24.11.2012
Сообщений: 3,993
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     Зачем компилятору что-то упорядочивать после вычисления второго операнда логического "или"?
Ответ Создать тему
Опции темы

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