Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.06.2011, 16:41
|
|
Частый гость
Регистрация: 11.12.2010
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Вопрос по синтаксису в С
Только начал перелазить с асма на С. Вот наткнулся на проблему:
Если делать так:
--------------
if (условие1 )
действие1;
действие2;
if (условие2 && условие3 )
действие2;
---------------
то всё нормально.
действие2 это довольно большой кусок кода.
Поэтому, чтобы не вставлять его два раза, решил попробовать сделать так:
--------------
if (условие1 )
действие1;
if ((условие1 ) || (условие2 && условие3 ))
действие2;
--------------
не работает.
Похоже что связка if ((условие1 ) || (условие2 && условие3 )) как-то не так компилится. А почему?
Последний раз редактировалось ritmauto; 30.06.2011 в 16:53.
|
|
|
Сказали "Спасибо" ritmauto
|
|
|
30.06.2011, 17:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вопрос по синтаксису в С
Сообщение от ritmauto
|
Только начал перелазить с асма на С. Вот наткнулся на проблему:
Если делать так:
--------------
if (условие1 )
действие1;
действие2;
if (условие2 && условие3 )
действие2;
---------------
то всё нормально.
действие2 это довольно большой кусок кода.
Поэтому, чтобы не вставлять его два раза, решил попробовать сделать так:
--------------
if (условие1)
действие1;
if ((условие1) || (условие2 && условие3))
действие2;
--------------
не работает.
Похоже что связка if ((условие1 ) || (условие2 && условие3 )) как-то не так компилится. А почему?
|
По первому коду у вас действие2 будет выполняться ВСЕГДА, а согласно второму правилу еще и дважды.
Код:
|
if(условие1) действие1;
действие2;
if(условие2 && условие3) действие2; |
Вы действительно так хотите? Или забыли про операторные скобки?
Насчет "большого куска кода" - оформите в виде функции, сможете вызывать сколько угодно раз. Но с логикой советую разобраться. У вас в примере она хромает.
Рекомендую правильно форматировать текст, будет понятнее в чтении.
Последний раз редактировалось ut1wpr; 30.06.2011 в 17:16.
|
|
|
|
30.06.2011, 17:17
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Ну, так у вас
Сообщение от ritmauto
|
Только начал перелазить с асма на С. Вот наткнулся на проблему:
Если делать так:
--------------
if (условие1 )
действие1;
действие2;
if (условие2 && условие3 )
действие2;
---------------
то всё нормально.
действие2 это довольно большой кусок кода.
Поэтому, чтобы не вставлять его два раза, решил попробовать сделать так:
--------------
if (условие1 )
действие1;
if ((условие1 ) || (условие2 && условие3 ))
действие2;
--------------
не работает.
Похоже что связка if ((условие1 ) || (условие2 && условие3 )) как-то не так компилится. А почему?
|
в первом варианте действие1 выполняется вначале безусловно, в не зависимости от условия1. Разберитесь сначала с тем, что именно вам нужно. Нарисуйте алгоритм на уровне квадратиков, тогда сразу станет ясно. Или нет?
PS: можете выложить кусок ассемблерного кода здесь. Авось общими усилиями разберемся.
|
|
|
|
30.06.2011, 17:19
|
|
Частый гость
Регистрация: 23.08.2007
Сообщений: 27
Сказал спасибо: 1
Сказали Спасибо 28 раз(а) в 13 сообщении(ях)
|
Re: Вопрос по синтаксису в С
все что в "действие2" загнать в функцию. тогда два раза ничего не вставится. будет только вызов ф-ии.
|
|
|
Сказали "Спасибо" hostel6psu
|
|
|
30.06.2011, 17:25
|
|
Частый гость
Регистрация: 11.12.2010
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Вопрос по синтаксису в С
Сообщение от ut1wpr
|
По первому коду у вас действие2 будет выполняться ВСЕГДА, а согласно второму правилу еще и дважды.
Код:
|
if (условие1) действие1;
действие2;
if (условие2 && условие3) действие2; |
Вы действительно так хотите? Или забыли про операторные скобки?
Насчет "большого куска кода" - оформите в виде функции, сможете вызывать сколько угодно раз. Но с логикой советую разобраться. У вас в примере она хромает.
Рекомендую правильно форматировать текст, будет понятнее в чтении.
|
Забыл про скобки, сорри.
Вот так правильно:
Код:
|
if (условие1)
{
действие1;
действие2;
}
if (условие2 && условие3) действие2; |
Насчет "большого куска кода" - оформить в виде функции - можно.
Просто хотел понять почему не работает так:
Код:
|
if (условие1) действие1;
if ((условие1) || (условие2 && условие3)) действие2; |
Причем! Выяснил - из ((условие1) || (условие2 && условие3)) не отрабатывает только первая часть ИЛИ. По второй части отработка нормальная.
Последний раз редактировалось ritmauto; 30.06.2011 в 17:41.
|
|
|
Сказали "Спасибо" ritmauto
|
|
|
30.06.2011, 21:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вопрос по синтаксису в С
Сообщение от ritmauto
|
Выяснил - из ((условие1) || (условие2 && условие3)) не отрабатывает только первая часть ИЛИ. По второй части отработка нормальная.
|
Проверяйте само условие. В приведенном примере ошибки нет.
|
|
|
|
30.06.2011, 22:14
|
|
Частый гость
Регистрация: 11.12.2010
Сообщений: 10
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Вопрос по синтаксису в С
Сообщение от ut1wpr
|
Проверяйте само условие. В приведенном примере ошибки нет.
|
Хм.. Так первый вариант же работает отлично. Т.е. Условие1 отрабатывается нормально.
вот думаю - не может это конкретный компилятор дурить (Keil), какие-то его установки?? С получающимся ассемблером пока не разбирался.
Последний раз редактировалось ritmauto; 30.06.2011 в 22:20.
|
|
|
Сказали "Спасибо" ritmauto
|
|
|
30.06.2011, 22:31
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Интересно, но начинающие почему-то
Сообщение от ritmauto
|
Хм.. Так первый вариант же работает отлично. Т.е. Условие1 отрабатывается нормально.
вот думаю - не может это конкретный компилятор дурить (Keil), какие-то его установки?? С получающимся ассемблером пока не разбирался.
|
прежде всего грешат на компилятор.
|
|
|
|
30.06.2011, 22:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вопрос по синтаксису в С
Сообщение от ritmauto
|
Хм.. Так первый вариант же работает отлично. Т.е. Условие1 отрабатывается нормально.
вот думаю - не может это конкретный компилятор дурить (Keil), какие-то его установки?? С получающимся ассемблером пока не разбирался.
|
Не надо людям голову морочить, приведите текст условий. Смоделируем, посмотрим. Чего гадать? Условие1 - это еще не условие..
|
|
|
|
30.06.2011, 23:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,827
Сказал спасибо: 739
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
|
Re: Вопрос по синтаксису в С
Может дело в приоритетах операций ? приоритет лог И выше чем лог ИЛИ.
Поставьте вместо условия1 единицу или true ( как там в Вашем компиляторе), действие2 должно выполниться в любом случае.
Код:
|
if ((1) || (условие2 && условие3)) действие2; |
оффтоп - как ,черт возьми ,все путем было в Паскале , четко стройно ,алгоритмично.
__________________
Да здравствует Разум,да сгинет Маразм!
Последний раз редактировалось E_C_C; 30.06.2011 в 23:15.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:29.
|
|