Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выход из if 
:(
    Опции темы
_hunter
  Дата 30.5.2004, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



произойдет ли выход из if' a в такой конструкции:
if ( ( a ) || ( b ) || ( c ) )
при первом true (т.е. проверка b и c выполнятся не будет )
, а из такой:
if ( ( a ) && ( b ) && ( c ) )
при первом false?

Заранее благодарю за ответ.





--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Elfet
Дата 30.5.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Из первой нет,
а из второго да, выдет тобишь.


--------------------
PM MAIL WWW Skype   Вверх
p0s0l
Дата 30.5.2004, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



В Delphi есть такая опция "Complete boolean eval", возможно она есть и в BC... Если её включить, то выражение будет всегда досчитываться до конка, даже если уже результат известен...
В обоих случаях || или && один раз всё равно сделается, а потом уже будет происходить проверка (это более эффективно с точки зрения оптимизации)...


--------------------
С уважением, г-н Посол.
PM   Вверх
Дрон
Дата 30.5.2004, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Цитата
В Delphi есть такая опция "Complete boolean eval", возможно она есть и в BC...

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



--------------------
Да. Именно так.
PM   Вверх
p0s0l
Дата 30.5.2004, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Дрон, ну может и так, я в этом не особого сведущ...
Только странный стандарт получается...
Пример:
if ( ( a ) || ( b ) || ( c ) || ( somefunc1() ) )
somefunc1 - какая-то функция.
Если a==true, то somefunc1 не вызовется, а если она делает что-то критично важное (бывают такие случаи), то будет облом.
По-крайней мере в Delphi по-умолчанию complete boolean eval отключено, и была прога, где я долго голову ломал, из-за чего она не работает (тогда я не знал об этой фиче). Оказалось, что этот somefunc1 не вызывался...
Конечно, можешь сказать: "ставь somefunc1" в начало if'а", но что если таких somefunc'ов несколько ?...


--------------------
С уважением, г-н Посол.
PM   Вверх
Дрон
Дата 30.5.2004, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Цитирую из книги Кернигана и Ричи "Язык С":

Цитата
... Выражения,  связанные операциями && или || , Рассматриваются слева на право, и при этом гарантируется, что оценивание выражений будет прекращено, как только станет ясно, является ли все выражение истинным или ложным...
... В данном случае это не имеет принципиального значения, но, как мы скоро увидим, в более сложных ситуациях эта особенность языка весьма существенна.




--------------------
Да. Именно так.
PM   Вверх
Anklav
Дата 30.5.2004, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.12.2003
Где: Менск

Репутация: нет
Всего: 1



Цитата
но что если таких somefunc'ов несколько

А что если эти функции будут очень большими, на вычисление которых уходит много времени.
Тут уже прямо сказать нельзя, что лучше. Поэтому, наверно, в стандарте чётко и ясно сказано, что лишнее не будет выполняться.
А вот возможность переключение "режима", по моему мнения, - плохо, т.к. может быть такое, что в одной части кода для нормальной работы должна быть включена эта опция, а для другой выключена, а это потеря времени и всё такое.
PM ICQ   Вверх
Дрон
Дата 30.5.2004, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Я, кстати, в своих прогах иногда пишу так:
Код
if (n<ArraySize && Array[n] == Something) { ... }

Если n выходит за границы массива, то и заглядывать в массив мы не будем.
Так что для меня эта особенность полезна.

Это сообщение отредактировал(а) Дрон - 30.5.2004, 21:24


--------------------
Да. Именно так.
PM   Вверх
p0s0l
Дата 30.5.2004, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Согласен, что в подавляющем большинстве случаев это и лучше и полезнее и удобнее... Поэтому видимо это "зашили" в стандарт в Си...
Цитата
А вот возможность переключение "режима", по моему мнения, - плохо, т.к. может быть такое, что в одной части кода для нормальной работы должна быть включена эта опция, а для другой выключена, а это потеря времени и всё такое.

Ну там (в delphi/pascal) это решалось бы с помощью директив {$B+} и {$B-}, так что это не является неудобством... Но тут речь не о Delphi...
Цитата
Я, кстати, в своих прогах иногда пишу так:

Код 
if (n<ArraySize && Array[n] == Something) { ... }

Если n выходит за границы массива, то и заглядывать в массив мы не будем.
Так что для меня эта особенность полезна.

Согласен. Тоже так же делаю...

Всё, вопросов больше не имею smile.gif


--------------------
С уважением, г-н Посол.
PM   Вверх
gray_k
Дата 31.5.2004, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



С++ делает так:
if( (a) || (b) || © ) -
если a = true, то b и c не проверяется, все выражение есть истина,
иначе, если b=true, то с не проверяется, все выражение - истина,
иначе, если c=true, то выражение - истина,
иначе - выражение- фальш.


if( (a) | (b) | (с) )
проверить a, b, c, затем истинность выражения.

Это сообщение отредактировал(а) gray_k - 31.5.2004, 08:25


--------------------
С уважением.
Gray.
PM MAIL   Вверх
gepard
Дата 31.5.2004, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



p0s0l
Цитата
Если a==true, то somefunc1 не вызовется, а если она делает что-то критично важное (бывают такие случаи), то будет облом.

А ты сделай так:
Код

if ( somefunc1() || a || b || c)

В таком случае твоя жизненно-необходимая функция выполнится в любом случае.

gray_k
Цитата
if( (a) | (b) | (с) )
проверить a, b, c, затем истинность выражения.

Поясни, plz.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
DENNN
Дата 31.5.2004, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
но что если таких somefunc'ов несколько

Если вычисление их значений необъодимо, то такие функции ставят на первое место.
А в целом, если возникла такая проблема, то это говорит о плохом стиле написания кода.
Никто ведь не мешает присвоить это значение локальной переменной и потом ее проверить?

PM ICQ   Вверх
gray_k
Дата 31.5.2004, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Цитата
Поясни, plz.

Ну, например, если у тебя в условии несколько выражений, которые все надо выполнить, то надо использовать не логические операторы && и ||, а поразрядные логические операторы & и |. Их применение гарантирует, что все выражения, входящие в условие будут выполнены.
Пример:
Код

//глобальные перпеменные
int a = 1, b=2;
bool f1()
{
  if( a == 1 ) {
    b = 0;
     return true;
  }
   else
     return false;
}

bool f2()
{
 if( b == 2 )
   return true;
 else {  
   b = 2;
   return false;
 }
}

//теперь в после выполенения такого условия
if( f1() || f2() )
//b будет равно 0

//а после такого
if( f1() | f2() )
// b будет равно 2

Добавлено @ 10:38
Цитата
А в целом, если возникла такая проблема, то это говорит о плохом стиле написания кода.

Очень категоричное суждение.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Дрон
Дата 31.5.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Только следует заметить, что || и | ведут себя немного по-разному:
2 && 1 даст true.
2 & 1 даст 0 (что эквивалентно false).

Добавлено @ 12:46
DENNN
Цитата
А в целом, если возникла такая проблема, то это говорит о плохом стиле написания кода.
Согласен. Всегда можно сделать по-другому.



--------------------
Да. Именно так.
PM   Вверх
gepard
Дата 31.5.2004, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



gray_k и Дрон
Мерси. Теперь, вроде, понял.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1118 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.