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

Баг в GCC?

Две аналогичные записи:

 

1:

pAlarmLoop->WriteIndex=(pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1))?(pAlarmLoop-WriteIndex++):0;

 

2:

if (pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1))

pAlarmLoop->WriteIndex++;

else

pAlarmLoop->WriteIndex=0;

 

В едк первая не работает. Хотя эти две записи аналогичны

 

Проверил в вижал студио-работают обе.

 

Что за х?

 

Извините-случайно знак ">" стерся

1:

pAlarmLoop->WriteIndex=(pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1))?(pAlarmLoop->WriteIndex++):0;

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


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

GCC не знаю, но а если так написать:

pAlarmLoop->WriteIndex=(pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1))?(pAlarmLoop->WriteIndex+1):0;

По вопросу - может эта ситуация в стандарте на C не оговорена и компиляторы на своё усмотрение интерпретируют запись?

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


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

GCC не знаю, но а если так написать:

pAlarmLoop->WriteIndex=(pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1))?(pAlarmLoop->WriteIndex+1):0;

По вопросу - может эта ситуация в стандарте на C не оговорена и компиляторы на своё усмотрение интерпретируют запись?

 

:) Во я дурак-это же постфиксная запись! Сначала присваивается-а потом только меняется значение вроде. Ша попробую

 

Разумеется дело было не в жсс, а в прокладке между стулом и клавиатурой

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


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

Две аналогичные записи:

Это НЕ аналогичные записи.

Стандарт ISO/IEC 14882:1998, раздел 5, пункт 4:

...order of evaluation of operands of individual operators and subexpressions individual expressions, and the order in which side effects take place, is unspecified...

Другими словами, порядок вычисления pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1) и pAlarmLoop->WriteIndex++ зависит от компилятора.

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


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

Это НЕ аналогичные записи.

Стандарт ISO/IEC 14882:1998, раздел 5, пункт 4:

 

Другими словами, порядок вычисления pAlarmLoop->WriteIndex<(ALARM_BUF_SIZE-1) и pAlarmLoop->WriteIndex++ зависит от компилятора.

 

Неа-это тернарный оператор. Там всегда сначала вычисляется условие. Дело было в постфиксном ++

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


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

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

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

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

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

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

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

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

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

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