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

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
#1

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

15.08.2014, 04:51. Просмотров 206. Ответов 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.
То есть: если второй оператор вычислен, вычисление каждого выражения и побочный эффект, связанный с первым выражением упорядочиваются перед вычислением каждого оператора и побочным эффектом второго оператора.

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

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

Зачем перегружать операторы "++", "<<", ">>" и что они дают? - C++
Здравствуйте. Я хотел спросить зачем перегружать оператор &quot;++&quot;, &quot;&lt;&lt;&quot;, &quot;&gt;&gt;&quot; и что они нам дают?

Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел - C++
Вставить пробел после каждого символа &quot;.&quot; &quot;,&quot; &quot;!&quot; или &quot;?&quot;, если за этими символами не следует пробел (т. е. следует любой символ, кроме...

С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён. - C++
#define _CRT_SECURE_NO_WARNINGS #include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;iostream&gt; #define Pi 3.1416 #include &lt;clocale&gt;...

Как исправить ошибку "Функция в качестве левого операнда"? - C++
Пытаюсь запустить программу, но возникает ошибка: Функция в качестве левого операнда. Ссылается на строки с установлением цены. #include...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Что применить "\n" или "endl"? - C++
Эти две операции похожи - они переходят на новую строку. Но endl очищает буфер, но при этом дольше выполняется. Так что же лучше...

1
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
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;
    }
}
Наверное, можно придумать более реалистичный пример.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 05:20
Привет! Вот еще темы с ответами:

После каждого знака препинания (".", ",", ";") вставить в строку пробел, если там его нет - C++
Выполните задания с использованием библиотечного класса string. Даны строка S. Необходимо после каждого знака препинания (&quot;.&quot;, &quot;,&quot;,...

Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков "+", "-", "*". - C++
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков &quot;+&quot;, &quot;-&quot;, &quot;*&quot;. Групой...

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" - C++
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: &quot;Рабочий день&quot;,&quot;Суббота&quot; или...

Что Вы понимаете под "абстрактным типом", "абстракцией данных" и "абстрактными операциями"? - C++
А давайте займёмся археологией! И проследим как менялся смысл понятий &quot;абстрактный тип данных&quot;, &quot;абстракция данных&quot; и &quot;абстрактные...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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