Форум программистов «Весельчак У»
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
Начало
Наши сайты
Галерея
Весельчак У
Наша Вики
Хранилище
Проекты
Правила
Правила форума
Правила русского языка
Помощь
Поиск
Календарь
Почта
Войти
Регистрация
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
>
ANSI С/С++
(Модератор:
Вад
) > Тема:
Приотитет операций
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Приотитет операций (Прочитано 12245 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mangy rat
Гость
Приотитет операций
«
:
16-11-2007 21:03 »
У меня такой вопрос. В моей программе есть цикл while((c=wgetch(menu_win))!=KEY_F(1)){switch{...}} В этом цикле считывался символ и пока не нажмется F1 в зависимости от кейса выполняются различные действия. Я сделала ошибку и написала условие не поставив 1 скобки вот так:while(c=wgetch(menu_win)!=KEY_F(1))В результате програма не проходила ни по одному кейсу, делала 1 итерацию., но по F1 всегда выходила. Скобки я поставила, однако не совсем поняла, как конкретно без скобок расставлялся приоритет операций, почему выход работал стабильно, а кейсы даже на 1 итерации не работали. Поясните пожалуйста этот момент, я не могу понять что происходило в моей программе без скобок. Спасибо. (не могу выполнить пошагово и посмотреть как работает прога т к пишу в линуксе и пользуюсь стандартой командой компиляции)
Записан
Tuborg
Команда клуба
Offline
Re: Приотитет операций
«
Ответ #1 :
16-11-2007 21:23 »
а брюки тоже через голову одеваешь? нафига такие навороты?
почему не можешь написать вот так:
do{
if ((c=wgetch(menu_win))==0) continue;
switch (c){
case...
}
} while(c!=KEY_F(1));
ведь так же проще читать! =)
если чисто академический интерес к приоритетам... то немного не понятно написано.
ну отвечу так как понял...
while(c=wgetch(menu_win)!=KEY_F(1))
при равных приоритетах операции в языке Си выполняются справа налево...
сначала... вычисляется функция wgetch(menu_win)
потом её значение сравнивается с KEY_F(1)
а уж потом результат сравнения (0-false, 1-true) записывается в переменную С.
В результате в с - ничего похожего на код нажатой клавиши
а цикл while выполняется в зависимости от значения последней операции... false (т.е. в цикл не заходит), если была нажата клавиша KEY_F(1), и true (т.е. в цикл заходим), если была нажата любая другая клавиша... а что уж внутри switch делал - со значением 1 или 0 .... это уже у тебя надо спросить =).
Если честно сам не понял что написал =)
Записан
Dimka
Деятель
Команда клуба
Offline
Пол:
Re: Приотитет операций
«
Ответ #2 :
17-11-2007 07:10 »
Совсем просто было бы читать:
Код: (C)
exitFlag
=
0
;
while
(
!
exitFlag
)
{
c
=
wgetch
(
menu_win
)
;
switch
(
c
)
{
case
KEY_F
(
1
)
:
exitFlag
=
1
;
break
;
case
...
...
}
}
Записан
Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор
Offline
Пол:
Внимание! Люблю сахар в кубиках!
Re: Приотитет операций
«
Ответ #3 :
17-11-2007 07:23 »
оператор = имеет наименьший приоритет
этому сначала wgetch(menu_win)!=KEY_F(1)
затем результат в c
и потом уже if (c)
А внятное описание приоритетов я что-то в стандарте не нашел.
Записан
Странно всё это....
Sla
Команда клуба
Offline
Пол:
Re: Приотитет операций
«
Ответ #4 :
17-11-2007 09:41 »
dimka
, +1 Паскаль рулит
в смысле структуры (почти везде использую такую конструкцию)
Записан
Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба
Offline
Пол:
Re: Приотитет операций
«
Ответ #5 :
17-11-2007 10:52 »
Sla
, можно и без флажков, но для этого switch не подходит, а так тоже вполне читаемо:
Код: (C)
for
(
;;
)
{
c
=
wgetch
(
menu_win
)
;
if
(
c
==
KEY_F
(
1
)
)
break
;
else
if
(
...
...
}
Записан
Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор
Offline
Пол:
Re: Приотитет операций
«
Ответ #6 :
17-11-2007 13:23 »
Таблица приоритетов:
http://zeus.sai.msu.ru:7000/programming/c_unix/gl_9.shtml#9_1
Записан
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
mangy rat
Гость
Re: Приотитет операций
«
Ответ #7 :
18-11-2007 11:49 »
Спасибо за разъяснения. Хотя мне стыдно за то, что до сих пор не знала, что операции с равным приоритетом выполняются справо налево
Цитата: RXL от 17-11-2007 13:23
Таблица приоритетов:
http://zeus.sai.msu.ru:7000/programming/c_unix/gl_9.shtml#9_1
Спасибо за ссылочку! То что нужно для моего курсача
«
Последнее редактирование: 14-02-2008 20:38 от Вад
»
Записан
Anchorite
Гость
Re: Приотитет операций
«
Ответ #8 :
19-11-2007 06:29 »
Цитата: mangy rat от 18-11-2007 11:49
Спасибо за разъяснения. Хотя мне стыдно за то, что до сих пор не знала, что операции с равным приоритетом выполняются справо налево
Это не совсем так. У операций есть такое понятие как ассоциативность.
Например операции сложения и вычитания имеют равные приоритеты и выполняются слева направо.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
>
ANSI С/С++
(Модератор:
Вад
) > Тема:
Приотитет операций
Загружается...