C: приведите int к size_t

Как правильно преобразовать /привести int в size_t в C99 на 32-битной и 64-битной платформах Linux?

Пример:

int hash(void * key) {
    //...
}

int main (int argc, char * argv[]) {
    size_t size = 10;
    void * items[size];
    //...
    void * key = ...;
    // Is this the right way to convert the returned int from the hash function
    // to a size_t?
    size_t key_index = (size_t)hash(key) % size;
    void * item = items[key_index];
}
12 голосов | спросил cpburnz 30 MaramWed, 30 Mar 2011 05:59:47 +04002011-03-30T05:59:47+04:0005 2011, 05:59:47

3 ответа


0

Все арифметические типы неявно преобразуются в C. Очень редко вы нуждаетесь в приведении - обычно только тогда, когда вы хотите выполнить преобразование вниз, уменьшая по модулю 1 плюс максимальное значение меньшего типа, или когда вам нужно форсировать арифметику в unsigned Режим использования свойств без знака арифметики.

Лично мне не нравится смотреть актеры, потому что:

  1. Они отвратительные визуальные помехи, и
  2. Они предполагают, что человек, который написал код, получал предупреждения о типах и бросал вызовы, чтобы закрыть компилятор, не понимая причину предупреждений.

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

ответил R.. 30 MaramWed, 30 Mar 2011 06:57:23 +04002011-03-30T06:57:23+04:0006 2011, 06:57:23
0
size_t key_index = (size_t)hash(key) % size;

в порядке. Тебе даже не нужен актерский состав:

size_t key_index = hash(key) % size;

делает то же самое.

ответил Stephen Canon 30 MaramWed, 30 Mar 2011 06:13:25 +04002011-03-30T06:13:25+04:0006 2011, 06:13:25
0

Помимо проблемы приведения (которая вам не нужна, как указано выше), есть еще несколько запутанных вещей, которые могут пойти не так с кодом.

если hash() должен вернуть индекс в массив, он должен вернуть size_t. Так как это не так, вы можете получить странные эффекты, когда key_index больше, чем INT_MAX.

Я бы сказал, что size, hash(), key_index должны быть одного типа, вероятно, size_t чтобы быть уверенным, например:

size_t hash(void * key) {
    //...
}

int main (int argc, char * argv[]) {
    size_t size = 10;
    void * items[size];
    //...
    void * key = ...;

    size_t key_index = hash(key) % size;
    void * item = items[key_index];
}
ответил Tim 15 Mayam12 2012, 11:33:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132