![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
null56 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Собственно вопрос относится скорее к особенностям компиляции... собственно код
Всегда интеросовал этот момент, но всегда старался его избегать Вопрос: всегда ли данный код будет отрабатывать как надо и не вылетит мне с segmentationОМ? То есть всегда ли компилятор отработает условие слева раньше правого или все - таки это зависит от конкретного компилятора? Или стоит всегда использовать верный способ
Надеюсь не сочтете мой вопрос слишком глупым, но мне интересно.... Заранее благодарен за помощь |
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
if (p_my_class && p_my_class->myMethod())
эквивалентно if (p_my_class) { T r=p_my_class->myMethod(); if ® |
|||
|
||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
GoldFinch, гарантировано на любом компиляторе?
|
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
всегда. это т.н. вычисления по ускоренной схеме. Т.е. нет смысла проверять правый операнд, если левый будет равен 0. аналогично для операции || только обратитите внимание, что ускоренный вычисления работают только тогда, когда вы не переопределяете их явно. т.е. если вы в классе напишете operator&&(...) то это значит, что теперь забота о порядке вычислений лежит на вас. |
|||
|
||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
zim22, ну вопрос в том, чтобы компилятор не проверил правое условие и если оно верное начал проверять левое... потому что после проверки второго вперед первого, вылетит ошибка сегментации....
Вот я и спрашиваю, любой компилятор будет проверять условия слева направо, а не наоборот??? а не то, отработает ли второе, если первое ложно |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
да гарантировано. Из-за этой гарантии нерекомендуется перегружать операторы && и || Добавлено через 4 минуты и 17 секунд операторы && и || гарантируют порядок вычисления операндов стандартом. Это и является залогом того что второй операнд в зависимости от первого может не вычисляться. т.е. второй никогда не будет вычислен перед первым если ты не будешь переопределять эти операторы |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
null56, из умной книжки:
Логические операторы AND и OR всегда обрабатывают свой левый операнд раньше правого. Правый операнд обрабатывается только тогда, когда левый операнд не определил результат однозначно. Такой способ обработки значений называют вычислением по сокращенной схеме (short-circuit evaluation) |
|||
|
||||
null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 2 Всего: 12 |
Fazil6, спасибо, теперь понятно... то есть это на уровне стандарта получается...
Спасибо всем.... Добавлено @ 15:29 zim22, спасибо так понятнее Это сообщение отредактировал(а) null56 - 2.4.2009, 15:29 |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
null56, в арифметических операциях порядок не определён (a + b - неизвестно что сначала будет вычислено a или b), в вызове функции порядок вычисления аргументов (f(a, b, c) - a b или с, или c b или a, и может даже b a c), а логические && || и запятая (которая в роли операции, то есть f(a, (b , c), d) аргументы будут вычислятся в любом порядке, а второй аргумент (b, c) только слева направо)
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не надо смешивать в одну кучу порядок_выполнения, точки_следования и "сокращенные_вычисления" ![]() |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
&& , и + - это операции
, - может не быть операцией порядок вычисления в операциях определён чётко, а то, что к ним не относится, может варьироваться
здесь () -> имеют приоритет выше, чем у &&, постфиксные выражения выполняются слева направо поэтому будет -> потом () и вопрос видимо в том, может ли быть компилятор, который среагирует на приоритет значит в стандарте должно быть где-то записано, что выражения с && || всегда выполняются слева направо, независимо от содержимого их операндов Это сообщение отредактировал(а) inside_pointer - 3.4.2009, 02:35 |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
точнее сказать операторы, а вот результат их применения называется операцией
не до конца понял мысль...
|
||||||
|
|||||||
inside_pointer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
ну, аргументы в вызове идут через запятую, она не является операцией и её свойства зависят от свойств вызова функции, а когда она в списке объявления типа int i, a, b, c;, то её свойства зависят от свойств объявления, а когда она операция, тогда она работает везде одинаково и однозначно
чтобы это всё срабатывало так, как срабатывает, необходимо, чтобы приоритет операции && был выше, чем приоритет -> и (), иначе должна быть запись о том, почему она, находясь ниже по приоритету, выполняется первее, чем операции находящиеся выше
почему операция -> не выполнится первее && ? |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вы путаете для чего нужен приоретет операций... Его действие сказывается только на зависимых операциях. почему "не" ? операция -> выполнится вперед операции &&, но до нее дойдет только в случае, если p_my_class "правдив." Это сообщение отредактировал(а) mes - 3.4.2009, 17:53 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |