Вы пытаетесь записать переменную (b
), которая была объявлена const
.Это undefined behavior
в C ++.Неопределенное поведение означает, что в этот момент программа может сделать что угодно , все допустимо, включая печать совершенно неправильных чисел или даже сбой.
Сначала вы пообещали, что b
является постоянным, и ониВы нарушили это обещание.
Компилятор намекнул, что то, что вы делаете, не разрешено, заставив вас вставить приведение.Без приведения (int*)
ваш код не будет компилироваться, потому что он не является правильным.Бросок вокруг const
часто является намеком на то, что что-то не так.Существуют допустимые варианты использования const
, но не в таких ситуациях, как ваш код, где базовой переменной действительно является const
.
Все случаи, когда вам разрешено приводить const
, включают неконстантную переменную и имеют постоянный указатель на нее, а затем приводят указатель const
к неконстантной, дляпример, так как вы все еще поддерживаете логическое постоянство, например, вы поддерживаете важный инвариант.Но базовое хранилище всегда неконстантно в этих сценариях.
Наиболее вероятно, что происходит в вашем сценарии:
Компилятор помнит, что вы хотите присвоить значению 5 имя b
.Он также понимает, что вы берете указатель на b
, поэтому он также резервирует место для b
в стеке.Скорее всего, он даже не потрудится поместить 5 в стек до тех пор, пока вы не попытаетесь прочитать его, но вы никогда этого не сделаете.Вместо этого вы перезаписываете местоположение для b
в стеке с помощью 6. Таким образом, операторы печати сначала печатают a 6 (для расположения b в стеке), а затем 5 (компилятор просто вставляет 5 везде, где вы используете * 1027).*).