2009-11-21 4 views
1

Каков правильный способ использования логических операторов с типами size_t и pid_t? Я имею в виду: законно ли написать что-то вроде следующего?
.: напримерКак сравнить size_t и pid_t с int

size_t sz; 
/* some kind of assignment */ 
if(sz > 0){ 
    /* do something */ 
} 

.: например

void f(pid_t pid,...){ 
    if(pid > 0){ 
    /* do something */ 
    } 
    /* ... */ 
} 

..or Я должен сделать некоторые актеров?

EDIT
ok для ответов;
теперь считается, что было сказано, может кто-то дать мне повод для кодирования таким образом:

void *my_malloc(size_t size){ 
    if(size <= 0){ 
    return NULL; 
    } 
    /* something else... */ 
} 

Мой учитель написал этот код.
Имеет ли смысл?
Я не знаю, сколько бит зарезервировано для size_t типа (зависит от реализации)
но, безусловно, это неподписанный (ваш ответ), так почему же это выражение?

+0

спасибо за редактирование, я пытался отформатировать его правильно – Marco

ответ

6

Да, это законно. Оба аргумента до > будут продвигаться до типа соответствия до того, как будет выполнено сравнение.

Знайте, что для неподписанного типа, такого как size_t, > 0 означает то же, что и != 0.

1

size_t и pid_t действительно являются целыми значениями разных вкусов - так что да.

От всего, что я понимаю, все дело в том, что аромат size_t и pid_t может различаться между реализациями, ОС и архитектурами (скажем, 32 бит в 64 бит) и еще много чего.

0

В C size_t является неподписанным типом, а его размер - это размер, который тип int использует базовую архитектуру.

Поскольку C слабо набрано, вы можете назначить целые числа со знаком size_t. Ответственность за использование типов должным образом зависит от программиста.

В вашем случае, поскольку вы сравниваете тип size_t с нолем, это нормально. Попробуйте сравнить его с отрицательным числом. Вы были бы удивлены.

0

Там нет никаких проблем при сравнении значения size_t с int значения до тех пор, как вы помните, что значение int будет неявно преобразуются в беззнаковый тип (с size_t беззнаковыми).

Из-за вышеизложенного некоторые компиляторы выдают предупреждение, когда вы смешиваете типы подписей и без знака в сравнении. В этом случае, чтобы подавить предупреждение, вам нужно явно преобразовать значение, подписанное в соответствующий неподписанный тип. Однако эти компиляторы обычно не вызывают никаких предупреждений, когда подписанное значение является неотрицательной константой времени компиляции, что означает, что в вашем примере нет необходимости вводить явный 0 в беззнаковый тип (или использовать 0U).

Смежные вопросы