реклама на сайте
подробности

 
 
> приоритеты математических и логических операций
demiurg_spb
сообщение Aug 20 2009, 16:31
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Код
static const uint8_t X_MAX = 100;
uint8_t x;
uint8_t y;

y = (x < X_MAX)? (x+1):x;    // 1
y = x + ((x < X_MAX)? 1:0);  // 2
y = x + (x < X_MAX)? 1:0;    // 3

Первый и второй варианты верны, третий - нет.
Видимо играют роль приоритеты математических и логических операций.
Кому не сложно прокомментируйте. Спасибо!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dima_G
сообщение Aug 21 2009, 08:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(demiurg_spb @ Aug 20 2009, 20:31) *
Код
static const uint8_t X_MAX = 100;
uint8_t x;
uint8_t y;

y = (x < X_MAX)? (x+1):x;    // 1
y = x + ((x < X_MAX)? 1:0);  // 2
y = x + (x < X_MAX)? 1:0;    // 3

Первый и второй варианты верны, третий - нет.
Видимо играют роль приоритеты математических и логических операций.
Кому не сложно прокомментируйте. Спасибо!


Используй всегда скобки для определения порядка выполнения операций. Код будет более наглядным, и меньше вероятность посадить багу
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 21 2009, 09:10
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Dima_G @ Aug 21 2009, 11:53) *
Используй всегда скобки для определения порядка выполнения операций. Код будет более наглядным, и меньше вероятность посадить багу
a = b + c * d; - в таких выражениях тоже?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 2 2009, 17:31
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Вот наткнулся на очередное своё заблуждение
Код
void rtc_clr(rtc_t* rtc) // no good
{    
    for (unsigned char i=0; i<sizeof(rtc_t); i++)
    {
        *(unsigned char*)rtc++ = 0;
    }
}

void rtc_clr(rtc_t* rtc) // good
{    
    unsigned char* p = (unsigned char*)rtc;

    for (unsigned char i=0; i<sizeof(rtc_t); i++)
    {
        *p++ = 0;
    }
}

void rtc_clr(void* rtc) // good with void* ???
{    
    for (unsigned char i=0; i<sizeof(rtc_t); i++)
    {
        *(unsigned char*)rtc++ = 0;
    }
}
Первый вариант очищает память как решето через промежутки равные sizeof(rtc_t) пишет нолики.
А второй и третий вариант делают то, что нужно (байт в байт асмовый листинг).
Что тут происходит с приоритетностью оператора ++ и оператора (unsigned char*) и как её меняет void*?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016