![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
_hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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... |
|||
|
||||
Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Из первой нет,
а из второго да, выдет тобишь. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
В Delphi есть такая опция "Complete boolean eval", возможно она есть и в BC... Если её включить, то выражение будет всегда досчитываться до конка, даже если уже результат известен...
В обоих случаях || или && один раз всё равно сделается, а потом уже будет происходить проверка (это более эффективно с точки зрения оптимизации)... -------------------- С уважением, г-н Посол. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
По-моему, такого в Си быть не может, так как сам стандарт языка говорит о том, что проверка должна останавливаться, когда результат очевиден. -------------------- Да. Именно так. |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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'ов несколько ?... -------------------- С уважением, г-н Посол. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Цитирую из книги Кернигана и Ричи "Язык С":
-------------------- Да. Именно так. |
|||
|
||||
Anklav |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.12.2003 Где: Менск Репутация: нет Всего: 1 |
А что если эти функции будут очень большими, на вычисление которых уходит много времени. Тут уже прямо сказать нельзя, что лучше. Поэтому, наверно, в стандарте чётко и ясно сказано, что лишнее не будет выполняться. А вот возможность переключение "режима", по моему мнения, - плохо, т.к. может быть такое, что в одной части кода для нормальной работы должна быть включена эта опция, а для другой выключена, а это потеря времени и всё такое. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Я, кстати, в своих прогах иногда пишу так:
Если n выходит за границы массива, то и заглядывать в массив мы не будем. Так что для меня эта особенность полезна. Это сообщение отредактировал(а) Дрон - 30.5.2004, 21:24 -------------------- Да. Именно так. |
|||
|
||||
p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Согласен, что в подавляющем большинстве случаев это и лучше и полезнее и удобнее... Поэтому видимо это "зашили" в стандарт в Си...
Ну там (в delphi/pascal) это решалось бы с помощью директив {$B+} и {$B-}, так что это не является неудобством... Но тут речь не о Delphi...
Согласен. Тоже так же делаю... Всё, вопросов больше не имею ![]() -------------------- С уважением, г-н Посол. |
||||
|
|||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
gepard |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
p0s0l
А ты сделай так:
В таком случае твоя жизненно-необходимая функция выполнится в любом случае. gray_k
Поясни, plz. -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
||||||
|
|||||||
DENNN |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Если вычисление их значений необъодимо, то такие функции ставят на первое место. А в целом, если возникла такая проблема, то это говорит о плохом стиле написания кода. Никто ведь не мешает присвоить это значение локальной переменной и потом ее проверить? |
|||
|
||||
gray_k |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Ну, например, если у тебя в условии несколько выражений, которые все надо выполнить, то надо использовать не логические операторы && и ||, а поразрядные логические операторы & и |. Их применение гарантирует, что все выражения, входящие в условие будут выполнены. Пример:
Добавлено @ 10:38
Очень категоричное суждение. -------------------- С уважением. Gray. |
||||||
|
|||||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Только следует заметить, что || и | ведут себя немного по-разному:
2 && 1 даст true. 2 & 1 даст 0 (что эквивалентно false). Добавлено @ 12:46 DENNN
-------------------- Да. Именно так. |
|||
|
||||
gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
gray_k и Дрон
Мерси. Теперь, вроде, понял. -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |