| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
C и как определить четное число
07.08.2012, 21:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от Yurkin2007
|
|
Так, что у топикстартера 1==1 заменялся на true, что есть просто 1, и потом спокойно делался битвайз "И" с Rendom. И всё работало как надо ...
|
Все варианты абсолютно эквивалентны, притом, вне зависимости от приоритета, а условие == можно(желательно) выкинуть.
|
|
|
|
08.08.2012, 04:17
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от Yurkin2007
|
|
Щас спытал Борланд С++ на скорую руку. Оказывается, у него такие выражения мало того, что разрешены, они ещё имеют целое значение, ...
|
Что значит " оказывается"? Это соответствует правилам языка C.
Сообщение от Yurkin2007
|
|
... true, что есть просто 1, ...
|
Ни в коем случае нельзя рассчитывать на то, что true означает 1 - это не соответствует правилам языка C. False - это ноль, а true - это " не ноль", и только.
__________________
There's always more than one way to skin a cat.
|
|
|
|
08.08.2012, 09:48
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от tempora
|
|
Ни в коем случае нельзя рассчитывать на то, что true означает 1 - это не соответствует правилам языка C. False - это ноль, а true - это "не ноль", и только.
|
Вот про это я и намекал когда говорил что ==1 лишнее . 
Да видно зря.
__________________
Осторожно , злой кот
|
|
|
|
08.08.2012, 11:23
|
|
|
Прохожий
Регистрация: 10.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: C и как определить четное число
true (TRUE, True и т.д.) а также false... не определены в языке Си, равно как и в языке Си++.
При сравнении в Си "истина" это "не ноль" а ложь это "ноль" вне зависимости от количества бит переменной.
В Си нет "логического" типа данных (bool (C#), boolean (Java), Boolean, (Pascal) и т.д.)
Исходя из вопроса как определить четное (нечетное) число, т.е. число у которого младший бит равен "0" можно так:
if (!(random & 1)) {
// do something for even
}
нечетное соответственно:
if (random & 1) {
// do something for odd
}
|
|
|
|
08.08.2012, 11:32
|
|
|
Прохожий
Регистрация: 10.01.2011
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от dosikus
|
Вот про это я и намекал когда говорил что ==1 лишнее . 
Да видно зря.
|
Уважаемый dosikus "== 1" не всегда лишнее. Например если надо проверить наличие сразу нескольких бит например наличие 0 и 3 бита то такая проверка не лишняя:
if ((PORTA & 0x9) == 0x9) {
// do something for bit 0 and 3
}
не одно и тоже с:
if (PORTA & 0x9) {
// do something for bit 0 or 3
}
потому что в первом случаи something будет выполнено если оба бита 0 и 3 установленны в "1", а во втором - если хотя бы один из битов 0 или 3 установлен в единицу.
Первый вариант соответствует "логическому и" для бит 0 и 3 а второй "логическое или".
|
|
|
|
08.08.2012, 11:45
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от dgo42
|
|
Уважаемый dosikus "== 1" не всегда лишнее. Например если надо проверить наличие сразу нескольких бит например наличие 0 и 3 бита то такая проверка не лишняя:
|
Блин вы тему то читаете ? Или просто отписаться?
Что ищет ТС ????
__________________
Осторожно , злой кот
|
|
|
|
08.08.2012, 11:58
|
|
|
Прохожий
Регистрация: 10.01.2011
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 2 сообщении(ях)
|
Re: C и как определить четное число
На больших процах еще можно так:
if( random % 2 )
ну или if(!( random % 2 )) в зависимости от того, по чёту или нечету надо действовать.
На маленьких - надо смотреть во что превращается код,
gcc точно это дело оптимизирует, а вот авр - может таки деление делать.
|
|
|
|
08.08.2012, 12:14
|
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от tempora
|
|
true означает 1 - это не соответствует правилам языка C
|
Я, собственно, и имел это ввиду, когда обнаружил, что у Борланда
|
Код:
|
2 & true = 0
2 && true = true |
PS. Кстати, у Майкрософт такая же петрушка ...
Последний раз редактировалось Yurkin2007; 08.08.2012 в 12:37.
|
|
|
|
08.08.2012, 13:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.01.2007
Сообщений: 3,411
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от dgo42
|
|
true ... а также false... не определены в языке Си,
|
Это Вы немного мимо - речь шла не о терминальных символах языка, а о результатах операций. Если же говорить именно о самом типе:
Сообщение от dgo42
|
|
В Си нет "логического" типа данных
|
, то и это мимо - стандартом языка определен как тип _Bool (см. п.6.2.5 Types), так и значения true и false; кроме того, определено и макрорасширение bool - см. стандартный заголовочный файл stdbool.h.
Сообщение от dgo42
|
|
... равно как и в языке Си++.
|
А вот это - много мимо, тип bool и его значения true и false в языке C++ есть изначально. Например, гляньте Бьёрна Страуструпа "Язык программирования C++", третье издание, п.4.1.1 "Фундаментальные типы" (он там первый в перечислении типов - не ошибётесь) и п.4.2 "Логические типы" - конкретно о bool, true и false.
Сообщение от dgo42
|
|
При сравнении в Си "истина" это "не ноль" а ложь это "ноль" вне зависимости от количества бит переменной.
|
Не понял, при чём тут биты? Результат сравнения абстрагирован от типов операндов и одинаково определен на всех скалярных типах, в том числе на числах с плавающей точкой, и на указателях - какие там биты?
Я и себя поправлю - на самом деле, стандартом языка C определены именно значения 0 и 1 для ложного и истинного результатов операций сравнения, однако, раз напоровшись в каком-то компиляторе на '-1'-цу (0xFFFF), использовавшуюся для 'истины', я с тех пор избегаю таких жёстких привязок.
Сообщение от Yurkin2007
|
|
2 & true = 0
|
Так это же не операция сравнения!
__________________
There's always more than one way to skin a cat.
|
|
|
|
08.08.2012, 14:09
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 06.06.2008
Сообщений: 1,519
Сказал спасибо: 76
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: C и как определить четное число
Сообщение от tempora
|
|
Так это же не операция сравнения!
|
Ну, если уж на это пошло, то слева не lvalue переменная.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:40.
|
|