Перейти к содержанию
    

Вопрос к знатокам С.

Однако считаю, что в случае отдельно стоящей volatile-переменной в духе

 UDR;

компилятор должен провести все действия, необходимые для вычисления выражения (в данном случае только прочесть переменую, в случае с UDR+1; - прочесть и прибавить единицу), а только потом обнаружить, что результат-то никому не нужен и начать оптимизатором "отматывать" назад ненужные действия - пока не упрётся в запрет, поставленный квалификатором volatile. Т.е. чтение volatile-переменной должно остаться. Если какой-то компилятор этого не делает (это тоже, кажется, где-то в аське обсуждалось), то надо внимательно ещё раз прочесть стандарт и попытаться поругаться.

Те же самые рассуждения можно провести и в случае

if(UDR);

и результат по логике рассуждений будет тем же самым, но ошибка в случае с if не выдаётся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  volatile int x;
  x ? : x;

 

IAR AVR 4.12 выдает ошибки

Error[Pe029]: expected an expression

Error[Pe053]: expected a ":"

 

Как к этому относится с учетом вышесказанного?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как к этому относится с учетом вышесказанного?

Правильно ругается: стандарт не предусматривает выбрасывания операндов из :?.

 

Можно написать так:

  volatile int x;
  x ? 0 : x;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а, простите, разве писать читаемый всеми код - это уже признак дурного стиля программирования? по-моему, во все времена было наоборот... и на написанный без извратов код ни один компилятор не станет ругаться...

uchar temp = UDR;

по-моему, понятно абсолютно всем, не вызывает ошибок и ворнингов, компилится в ту же самую единственную команду...

 

P.S. Имхо, то, что язык позволяет писать конструкции, с трудом поддающиеся расшифровке "простыми смертными", еще не означает, что так писать - хорошо или круто. в русском языке много матерных оборотов, однако их использование в речи все-же осуждается... равно как и арго и т.п. сленг...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uchar temp = UDR;

по-моему, понятно абсолютно всем, не вызывает ошибок и ворнингов, компилится в ту же самую единственную команду...

Ворнинг выдает, т.к. temp не используется после присвоения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  volatile int x;
  x ? : x;

...

Как к этому относится с учетом вышесказанного?

 

Это расширение gcc: http://hubbard.engr.scu.edu/embedded/avr/d...ml#Conditionals

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно написать так:

  volatile int x;
  x ? 0 : x;

 

Все правильно, но вот конструкция, например

 char tmp = SPSR; // tmp далее не исп.;

генерит код чтения регистра а просто

 SPSR;

нет.

М.б. все таки "тупое" явное чтение в переменную более надежно,

чем варианты предлагаемые гуру.

IAR 4.12 оптимизация отключена.

 

 

Спасибо :a14:

Может и не убедительный, но все же аргумент в пользу "тупых" конструкций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все правильно, но вот конструкция, например

 char tmp = SPSR; // tmp далее не исп.;

генерит код чтения регистра а просто

 SPSR;

нет.

Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит SPSR не volatile, или используется старый плюсовый IAR. По-моему, дискуссия пошла на второй круг.

SPSR это регистр статуса SPI, все I/O регистры описаны в .h как VOLATILE

компилятор отнюдь не старый, проверил на IAR AVR 5.10 то же самое.

Может быть из-за моей неграмотности, но я так и не понял это все же баг

компилятора, или если данная форма отдана стандартом на реализацию, тогда фитча.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

компилятор отнюдь не старый, проверил на IAR AVR 5.10 то же самое.

Листинг посмотреть можно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Листинг посмотреть можно?

 

Если "тупо"

     10          {
     11            char tmp = SPCR; 
   \   00000000   B10D               [b]IN      R16, 0x0D[/b]
   \   00000002   2F20               MOV     R18, R16
     12            
     13            return; 
   \   00000004   E000               LDI     R16, 0
   \   00000006   E010               LDI     R17, 0
   \   00000008   9508               RET
   \   0000000A                      REQUIRE _A_SPCR
     14          }

 

Если с "изыском"

      9          int main()
   \                     main:
     10          {
     11            SPCR; 
     12            
     13            return; 
   \   00000000   E000               LDI     R16, 0
   \   00000002   E010               LDI     R17, 0
   \   00000004   9508               RET
     14          }

 

 

 

Листинг посмотреть можно?

Еще один из обсуждавшихся вариантов:

      9          int main()
   \                     main:
     10          {
     11            [b](void)SPCR;[/b] 
     12            
     13            return; 
   \   00000000   E000               LDI     R16, 0
   \   00000002   E010               LDI     R17, 0
   \   00000004   9508               RET
     14          }

То же самое. Чтения нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это вообще просто "C" - начиная с K&R. Совершенно переносимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это вообще просто "C" - начиная с K&R. Совершенно переносимо.

Тогда почему в C99 об этом ни слова нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это вообще просто "C" - начиная с K&R. Совершенно переносимо.

Только если выражение после ? не пустое.

Therefore, the expression

 

x ? : y

 

has the value of x if that is nonzero; otherwise, the value of y.

 

This example is perfectly equivalent to

 

x ? x : y

Евгений абсолютно прав.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда почему в C99 об этом ни слова нет?

Да? Могу, конечно, ошибаться :(. Но все встреченные на жизненном пути компиляторы начиная с TurboC 1.0 такое поддерживали и поддерживают. Удобно очень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...