|
|
  |
Очерёдность обработки условий оператора IF, Строго по очереди? |
|
|
|
Dec 18 2008, 18:19
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Вдруг вот задался вопросом, имеет ли право компилятор менять очерёдность проверки условий в строках, подобных такой: Код static CTimer tmrPowerOFF;
if (tmrPowerOFF.Running() && tmrPowerOFF) ... то есть если вместо вызова Running() сначала будет обрабатываться bool ... Просто тогда у меня результат будет совершенно неверный.
|
|
|
|
|
Dec 18 2008, 19:16
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(rezident @ Dec 18 2008, 23:14)  Имеет полное право. Порядок проверки expression стандартом не регламентируется. Если вам важна очередность проверки условий, то пользуйтесь вложенными контейнерами. Код if (tmrPowerOFF.Running()!=0) { if (tmrPowerOFF!=0) { ... } } Ну вот, не зря я про это подумал! Спасибо, буду знать!
|
|
|
|
|
Dec 18 2008, 19:37
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(rezident @ Dec 18 2008, 22:14)  Имеет полное право. Порядок проверки expression стандартом не регламентируется. Если вам важна очередность проверки условий, то пользуйтесь вложенными контейнерами. Код if (tmrPowerOFF.Running()!=0) { if (tmrPowerOFF!=0) { ... } } только поменяйте порядок проверок, иначе выглядет странно ...
|
|
|
|
|
Dec 18 2008, 19:48
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Про С++ не скажу, нет под рукой стандарта, а С от 99-го года явно предписывает вычислять слева направо, и не вычислять второе выражение, если результат уже ясен. Цитата 6.5.13 Logical AND operator Syntax 1 logical-AND-expression: inclusive-OR-expression logical-AND-expression && inclusive-OR-expression Constraints 2 Each of the operands shall have scalar type. Semantics 3 The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0. The result has type int. 4 Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated. и аналогично для оператора или.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Dec 18 2008, 19:55
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SSerge @ Dec 18 2008, 22:48)  Про С++ не скажу, нет под рукой стандарта, а С от 99-го года явно предписывает вычислять слева направо, и не вычислять второе выражение, если результат уже ясен. и аналогично для оператора или. похоже Вы правы, просто все изначально подозревают здесь неодназначность... Интересно проверить компиляторы на соответствие этому пункту стандарта...
|
|
|
|
|
Dec 18 2008, 20:22
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(singlskv @ Dec 18 2008, 23:09)  ИМХО, может получиться неплохой тест для компайлеров... Никаких тестов не надо, представьте, что это вложенные if и до второго выражения, вне зависимости от vоlatile прочего, очередь просто не доходит. А сишные компиляторы явно нарушающие стандарт языка вымерли уже давно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 18 2008, 22:20
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
стормозил... да, наверное Вы правы, всегда будет только 1 проверка. Цитата(rezident @ Dec 18 2008, 22:59)  Посыпаю голову пеплом  Я спутал логическую операцию с бинарной. Предложенный мной вариант конечно же cработает, но я был не прав. Он как раз может очень странно сработать если tmrPowerOFF==0 ...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|