Почему он все еще может компилироваться / запускаться после изменения местоположения разных параметров с разными типами?
Прошлой ночью я потратил 1 час на отладку. Я писал программу Huffman_coding. Часть моего неправильного кода - удар:
class HTree
{
public:
HTree* left;
HTree* right;
int weight;
char ch;
HTree(){left = right = NULL; ch = '\0'; weight = 0;}
HTree(HTree* l, HTree* r, char c, int w){left = l; right = r; ch = c; weight = w;}
~HTree(){delete left; delete right;}
bool ISleaf(){return !left && !right;}
};
И это один кусок кода в HTree* BuildTree(int* frequency)
:
QTree.push(new HTree(NULL, NULL, frequency[i], (char)i));
Как видно, порядок этих двух параметров обратный - char c, int w
а также frequency[i], (char)i
, Я не осознавал эту маленькую ошибку в начале. Вывод, конечно, неверный.
Но мой вопрос: почему он все еще может компилироваться? или почему он все еще может работать? Потому что ответ / cout совершенно неправильно. И в соответствии с различными типами, я думаю, что он не может успешно скомпилировать - char != int
, я прав?
Может кто-нибудь сказать мне, почему это происходит? Это автоматически конвертировать int
в char
а также char
в int
, а затем он может скомпилировать и запустить, и получил неправильный ответ?
Что ж, позвольте мне уточнить, мой главный вопрос не в том, может ли он автоматически общаться или нет, поэтому мой ответ неверен, если обратное может произойти автоматически.
Неправильный вывод:
Заранее спасибо!
3 ответа
Да, есть неявные преобразования из char
в int
и из int
в char
,
C++ может преобразовывать символы (которые являются 8-битными целыми числами) в int, используя неявное приведение, если целевой тип шире, чем исходный тип, что имеет место в данном случае (int обычно имеет ширину 16 или 32 бита, в зависимости от платформы, char равен 8 немного). При назначении типа int для char компилятор обычно печатает предупреждающее сообщение (но назначение будет работать).
Это неправильно, потому что вместо частоты вы инициализируете каждый свой объект HTree с некоторыми i
значение. И c
элемент инициализируется с частотой. Так что из-за приведения ваш код будет компилироваться и работать, и все время давать неправильные результаты.