Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Условия  (Прочитано 9099 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 29-12-2009 00:30 » 

Привет, с наступающим всех! Улыбаюсь

Подскажите, пожалуйста, являются ли следующие два фрагмента кода полностью эквивалентными для компилятора?
Код:
if( a<5 )
{
     if ( a != 2 ) Do();
}

и
Код:
if (a <5 && a != 2 ) Do();

В том смысле, что если условие a < 5 не истинно, то следующее после && даже не будет тестироваться? 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 29-12-2009 04:15 » 

да.

Кстати, по этой причине вполне законно написать так:
Код:
if(p && p->F())
{
}

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

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 29-12-2009 07:37 » 

Эквивалентность зависит от реализации.

Бывают моменты, когда нужно выполнять "участок" сравнения ВСЕГДА одинаковое количество шагов (циклов), или ПРЕДСКАЗУЕМО одинаковое.

 
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
darkelf
Молодой специалист

ro
Offline Offline

« Ответ #3 : 29-12-2009 07:58 » 

Эквивалентность зависит от реализации.
Вроде как по стандарту - не зависит, а должна выполняться всегда.

6.5.13 Logical AND operator
...
4 Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation;
if the second operand is evaluated, there is a sequence point between the evaluations of
the first and second operands. If the first operand compares equal to 0, the second
operand is not evaluated
.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 29-12-2009 08:01 » 

darkelf, поддерживаю, стандарт требует, что бы проверки выполнялись слева на право и более чем нужно для получения результата.
Записан

Странно всё это....
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 29-12-2009 08:08 » 

Ребятки, я не говорю о стандарте компиляторов и прочего.
Я говорю о программной реализации.

 The Nameless One, ты занимаешься не тем, пытаешься найти каких-то блох в собачьей шкуре.

Ведь ты пишешь софт для управления/контроля чем-то/чего-то. Вот и  обрати внимание больше на это что-то.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 29-12-2009 09:36 » 

Спасибо всем:)

Sla, ну почему же сразу блох? Улыбаюсь Проект - проектом, но очень хочется постепенно разобраться в тонкостях языка, иначе как стать настоящим профи? Улыбаюсь
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 29-12-2009 09:51 » 

я даже придумал ( надумал)

Есть некие внешние регистры устройства, которые доступны к записи, только после того как с них прочитали информацию.

есть функция чтения этих регистров

F(address:word) {
}

If ( F(0x1) && F(0x2) )
{
}

Такой код наглядней, чем

temp01 = F(0x1)
temp02 = F(0x2)

If ( temp01 && temp02 )
{
}

Экономится ли при этом память? Надо смотреть.

Но с другой стороны второй код - и есть "обход" "ограничений" компилятора.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
darkelf
Молодой специалист

ro
Offline Offline

« Ответ #8 : 29-12-2009 10:18 » 

это не ограничения, а "фичи", и, наверное, не компилятора, а стандарта.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines