Что делает ! в С?

User avatar
AndreyT
Уже с Приветом
Posts: 3003
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Что делает ! в С?

Post by AndreyT »

perasperaadastra wrote: 18 May 2017 05:25 То есть ! не переворачивает все биты, а делает что-то другое. Вопрос — что именно?
По определению, в языке С выражение '!x' эквивалентно выражению 'x == 0'.
perasperaadastra wrote: 18 May 2017 06:16 while (!b) наверняка в это и компилируется на моем микроконтроллере.
Нет, конечно. Оно компилируется в 'while (b == 0)', как и должно.
Last edited by AndreyT on 19 May 2017 00:06, edited 1 time in total.
Best regards,
Андрей
User avatar
Ion Tichy
Уже с Приветом
Posts: 13339
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: Что делает ! в С?

Post by Ion Tichy »

thinker wrote: 18 May 2017 21:57
perasperaadastra wrote: 18 May 2017 17:21...

Code: Select all

do  {
     // считываем байт b
} while (!b);                        // выходим из петли если флаг 1
Кстати, тут b должна быть определена как volatile. А иначе компилятор может оптимизировать код так, что b будет прочитана только один раз, и ваша программа зависнет в бесконечном цикле.
Вы бредите.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
User avatar
AndreyT
Уже с Приветом
Posts: 3003
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: Что делает ! в С?

Post by AndreyT »

Ion Tichy wrote: 18 May 2017 06:05
partner_ca wrote: 18 May 2017 06:00
Ion Tichy wrote: 18 May 2017 05:54 ...и замаскировать все биты кроме последнего -если последний нужен- &1
Смотря который считать последним :-)
Для меня последний 0x80, а 0x01 - первый.
Еврей что ли или араб? Справа налево читаете?
Биты нумеруются от младших к старшим, с тем только замечанием, что нумерация традиционно ведется с нуля. Поэтому "первым" натуральнее назвать младший бит, а "последним" - старший. То есть именно 0x01 - "первый", а 0x80 - "последний".

И да, нумерация разрядов в позиционной записи числа растет справа-налево. Для этого совсем не надо быть евреем или арабом.
Best regards,
Андрей
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Что делает ! в С?

Post by perasperaadastra »

AndreyT wrote: 18 May 2017 23:34
perasperaadastra wrote: 18 May 2017 05:25 То есть ! не переворачивает все биты, а делает что-то другое. Вопрос — что именно?
По определению, в языке С выражение '!x' эквивалентно выражению 'x == 0'.
perasperaadastra wrote: 18 May 2017 06:16 while (!b) наверняка в это и компилируется на моем микроконтроллере.
Нет, конечно. Оно компилируется в 'while (b == 0)', как и должно.
Спасибо за объяснение. :fr: Сейчас глянул в ассембли вывод, и оказывается на данном микроконтроллере это очень удобно реализуется через

Code: Select all

sbrs	(Skip if Bit in Register is Set)
rjmp	(relative jump)
User avatar
perasperaadastra
Уже с Приветом
Posts: 20128
Joined: 21 Feb 2009 22:55
Location: Лох Онтарио

Re: Что делает ! в С?

Post by perasperaadastra »

Ion Tichy wrote: 18 May 2017 23:36
thinker wrote: 18 May 2017 21:57
perasperaadastra wrote: 18 May 2017 17:21...

Code: Select all

do  {
     // считываем байт b
} while (!b);                        // выходим из петли если флаг 1
Кстати, тут b должна быть определена как volatile. А иначе компилятор может оптимизировать код так, что b будет прочитана только один раз, и ваша программа зависнет в бесконечном цикле.
Вы бредите.
Thinker имеет аргумент:
https://barrgroup.com/Embedded-Systems/ ... le-Keyword

Edit: или речь о другом?

Хотя в моем случае компилятор хранит эту переменную всегда только в регистре, поэтому нет опасности.
User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: Что делает ! в С?

Post by thinker »

perasperaadastra wrote: 19 May 2017 01:06Thinker имеет аргумент:
https://barrgroup.com/Embedded-Systems/ ... le-Keyword

Edit: или речь о другом?
Именно это.
All rights reserved, all wrongs revenged.
User avatar
Serguei666
Уже с Приветом
Posts: 18917
Joined: 11 Jul 2003 01:00

Re: Что делает ! в С?

Post by Serguei666 »

partner_ca wrote: 19 May 2017 01:17
perasperaadastra wrote: 19 May 2017 01:06 Edit: или речь о другом?

Хотя в моем случае компилятор хранит эту переменную всегда только в регистре, поэтому нет опасности.
volatatile - это в первую очередь про глобальные данныe, к которым возможен доступ из нескольких потоков.
В данном случае совсем не в тему.
Судя по тому, что написал perasperaadastra, у него эта b как раз пишется-читается из нескольких потоков.

Return to “Вопросы и новости IT”