Я объясню чуть иначе.
По дефолту числовые константы имеют тип int. Поэтому сравнение
C++ Source Code:
if (str[0] == 0)
это неявное приведение типа.
Конечно, умный компилятор легко оптимизирует сравнение с нулем. Если мы пишем
C++ Source Code:
if (str[0] == '\0')
то сравниваем байт с байтом.
В данном случае тип роли не играет, и оба выражения имеют одинаковый смысл. Но так бывает далеко не всегда!
Пример:
C++ Source Code:
unsigned__int64 test = (1 << 40);
Как думаете, что будет в переменной test? 64-битное число (1<<40)? А вот не тут-то было! И 1, и 40 имеют тип int, а значит, операция сдвига имеет также тип int. Но это число превышает размер 32-битного числа, поэтому в итоге получается 0. Он-то радостно и присваивается 64-битному test-у.
А правильный код выглядит так:
C++ Source Code:
unsigned__int64 test = ((unsigned__int64)1 << 40);
следует понимать, что работа с 64-разрядными переменными, вообще имеет массу тонкостей.
То что обязательно для них, вовсе необязательно для 32-битных.
Также приведение типов играет важную роль при русификации и передаче данных по сети.
Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.
Дядя Миша писал: Ну да, все вы помните код READ_STRING в халфовской клиентке, когда передача буквы 'я' приводила к обрыву сообщения.
Просто потому, что char 'я' == -1.
это ещё не худший вариант
в НСке при печати Я вылет в винду или зависон компа... как повезёт...
Сорри за некропостинг, но более подходящей темы не нашел. В общем суть такова:
У нас есть некая структура
C++ Source Code:
1
typedefstruct
2
{
3
thing_t *something;
4
} somestruct_t;
5
6
static somestruct_t somestruct;
где thing_t в свою очередь выражен
C++ Source Code:
1
typedefstruct thing_t thing_s;
2
3
struct thing_s
4
{
5
struct other_s *other;
6
};
а в структура other_s в свою очередь:
C++ Source Code:
1
typedefstruct other_s
2
{
3
int number;
4
} other_t;
Вопрос - как получить доступ к переменной number, начиная с somestruct? Я пробовал разные варианты, все они ссылаются на C2228. Последний вариант, который выдает всего одну ошибку:
C++ Source Code:
somestruct.something->other.number;
Ошибка error C2228: left of '.number' must have class/struct/union type
Все, спасибо, там оказывается еще дело было в том, что other не был определен, то есть когда он передавался как параметр, все было нормально, а попытка обратиться к его членам выдавала C2027. Подключил нужный инклюд и все заработало