реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Очерёдность обработки условий оператора IF, Строго по очереди?
sonycman
сообщение Dec 18 2008, 18:19
Сообщение #1


Любитель
*****

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



Вдруг вот задался вопросом, имеет ли право компилятор менять очерёдность проверки условий в строках, подобных такой:
Код
static    CTimer    tmrPowerOFF;

if (tmrPowerOFF.Running() && tmrPowerOFF) ...

то есть если вместо вызова Running() сначала будет обрабатываться bool ...
Просто тогда у меня результат будет совершенно неверный.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 18 2008, 19:14
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Имеет полное право. Порядок проверки expression стандартом не регламентируется. Если вам важна очередность проверки условий, то пользуйтесь вложенными контейнерами.
Код
if (tmrPowerOFF.Running()!=0)
{ if (tmrPowerOFF!=0)
    { ...
    }
}
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 18 2008, 19:16
Сообщение #3


Любитель
*****

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



Цитата(rezident @ Dec 18 2008, 23:14) *
Имеет полное право. Порядок проверки expression стандартом не регламентируется. Если вам важна очередность проверки условий, то пользуйтесь вложенными контейнерами.
Код
if (tmrPowerOFF.Running()!=0)
{ if (tmrPowerOFF!=0)
    { ...
    }
}

Ну вот, не зря я про это подумал! Спасибо, буду знать! a14.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 18 2008, 19:37
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(rezident @ Dec 18 2008, 22:14) *
Имеет полное право. Порядок проверки expression стандартом не регламентируется. Если вам важна очередность проверки условий, то пользуйтесь вложенными контейнерами.
Код
if (tmrPowerOFF.Running()!=0)
{ if (tmrPowerOFF!=0)
    { ...
    }
}
только поменяйте порядок проверок, иначе выглядет странно ...
Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 18 2008, 19:48
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 18 2008, 19:55
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



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

Интересно проверить компиляторы на соответствие этому пункту стандарта...
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 18 2008, 19:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Посыпаю голову пеплом sad.gif Я спутал логическую операцию с бинарной. Предложенный мной вариант конечно же cработает, но я был не прав.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 18 2008, 20:09
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Wow, а какую интересную тему нам подкинул SSerge,
а если 2 операторор с volatile доcтупом ? ну там доступ к регистрам или еще что...

ИМХО, может получиться неплохой тест для компайлеров...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 18 2008, 20:22
Сообщение #9


Гуру
******

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



Цитата(singlskv @ Dec 18 2008, 23:09) *
ИМХО, может получиться неплохой тест для компайлеров...

Никаких тестов не надо, представьте, что это вложенные if и до второго выражения, вне зависимости от vоlatile прочего, очередь просто не доходит.
А сишные компиляторы явно нарушающие стандарт языка вымерли уже давно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Dec 18 2008, 22:20
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



стормозил...

да, наверное Вы правы, всегда будет только 1 проверка.

Цитата(rezident @ Dec 18 2008, 22:59) *
Посыпаю голову пеплом sad.gif Я спутал логическую операцию с бинарной. Предложенный мной вариант конечно же cработает, но я был не прав.
Он как раз может очень странно сработать если tmrPowerOFF==0 ...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 19 2008, 07:31
Сообщение #11


Любитель
*****

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



Цитата(singlskv @ Dec 19 2008, 02:20) *
стормозил...

да, наверное Вы правы, всегда будет только 1 проверка.

Он как раз может очень странно сработать если tmrPowerOFF==0 ...

Почему? Ничего странного здесь не вижу 05.gif
tmrPowerOFF == 0 если таймер запущен и ещё не отсчитал положенный интервал.
tmrPowerOFF != 0 если установленный интервал времени закончился.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016