Почему он все еще может компилироваться / запускаться после изменения местоположения разных параметров с разными типами?

Прошлой ночью я потратил 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 элемент инициализируется с частотой. Так что из-за приведения ваш код будет компилироваться и работать, и все время давать неправильные результаты.

Другие вопросы по тегам