С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
1

Порядок вычисления в условных выражениях

28.05.2015, 15:12. Показов 3075. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет !

Есть такой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Value = 0;
 
//
// Допустим, SomeFunction всегда меняет аргумент
// на ненулевой и всегда возвращает 1.
//
if ( (SomeFunction(&Value)) && Value )
{
    printf("YES\r\n");
}
else
{
    printf("NO\r\n");
}
Вопрос: могут ли в этом коде возникать побочные эффекты, в
результате которых в лог будет выведено не YES, а NO ?

Например, компилятор в процессе оптимизации сгенерирует код, где
Value записывается в регистр CPU еще ДО вызова SomeFunction и правая
часть выражения будет потом вычисляться с заранее взятым значением...
Да, я знаю, что подвыражения вычисляются слева-направо, но глядя на
этот код, что-то засомневался в конечном результате...

Нет ли здесь нарушения точек следования ?

Заранее благодарен всем ответившим по существу (особенно если
кто-нибудь еще приведет ссылку на соответствующий пункт
Стандарта, где такое поведение недвусмысленно определено).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2015, 15:12
Ответы с готовыми решениями:

Порядок вычисления в логических выражениях.
Мне стыдно такое спрашивать, но всё же. Что-то нагуглить не получается. Есть выражение вида A...

Порядок вычисления
Приветствую всех. Скажите, определяет ли стандарт Java порядок вычисления аргументов функции или...

Порядок вычисления выражения
Привет всем! Не пойму как вычисляется выражение : p = (p | e++ >> 2) & (++p >> 1), при р = 3; у...

порядок вычисления выражений
порядок вычисления выражений x>100\left| \right|x<=10 и y==0

1
66 / 66 / 18
Регистрация: 31.03.2015
Сообщений: 253
28.05.2015, 17:12 2
Операции && выполняются слева направо. Такая операция дает результат
1, если оба операнда ее отличны от нуля, иначе результат - 0. В
отличие от & при операции && гарантируется вычисление слева направо,
более того, второй операнд не вычисляется, если первый операнд равен 0.
Операнды не обязательно имеют одинаковый тип, но каждый должен быть
арифметического типа или типа указателя. Тип результата int. Все
побочные эффекты вычисления первого выражения могут возникать до
вычисления второго выражения.

Взято из Бьярн Страустрап. Справочное руководство по C++
Для ИЛИ тоже самое
Так что думаю, в вашем случае можно не опасатся кеширования значений.
0
28.05.2015, 17:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2015, 17:12
Помогаю со студенческими работами здесь

Порядок вычисления операций
У Страуструпа написано, что int i = 5; v = i++; Может вызвать неправильный результат, так...

Порядок вычисления выражения
if (! ( *(va_arg(argument_pointer, FILE**)) = fopen(va_arg(argument_pointer, char*), "r") ) ) ;...

порядок вычисления штрихов Шеффнера
есть выражение A|B|C, где А,В,С логические выражения, а | - штрих Шеффнера (И-НЕ). A|B|C = (A|B)|...

Порядок вычисления численного и символьного
Добрый день. Подскажите, пожалуйста, в чем причина несоответствия двух способов подсчитать...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru