Обновление:
Нейл указал в своем комментарии на вопрос, что вы получите ошибку, если скомпилируете это с флагами -Wall
и -pedantic
в g ++.
error: ISO C++ forbids variable-size array
Вы получаете ABC????
, потому что он печатает содержимое массива (ABC
) и продолжает печатать, пока не встретит \0
.
Если бы массив был {'A','B','C', '\0'};
, результат был бы ABC
, как и ожидалось.
Массивы переменной длины были введены в C99 - хотя, похоже, это не относится к C ++.
Это неопределенное поведение. Даже если вы закомментируете фиктивную декларацию, печатный вывод не всегда соответствует ожидаемому (ABC). Попробуйте задать значения ASCII для некоторого печатного символа (что-то между 32 и 126) вместо an_int
вместо 1, и вы увидите разницу.
an_int output
------------------------
40 ABC(
65 ABCA
66 ABCB
67 ABCC
296 ABC(
552 ABC(
1064 ABC(
1024*1024 + 40 ABC(
Видите образец здесь? Очевидно, он интерпретирует последний байт (LSB) an_int
как символ, печатает его, впоследствии каким-то образом находит нулевой символ и прекращает печать. Я думаю, что «как-то» связано с тем, что MSB-часть an_int
заполнена нулями, но я не уверен (и не смог получить никаких результатов, подтверждающих этот аргумент).
ОБНОВЛЕНИЕ: речь идет о заполнении MSB нулями. Я получил следующие результаты.
ABC(
для 40 - (3 нулевых байта и 40),
ABC((
для 10280 (то есть (40 << 8) + 40) - (2 нулевых байта и два 40 с), <br>
ABC(((
для 2631720 (то есть (10280 << 8) + 40) - (1 нулевой байт и три 40-х), <br>
ABC((((°¿®
для 673720360 (то есть (2631720 << 8) + 40) - нет нулевых байтов и, следовательно, печатает случайные символы до тех пор, пока не будет найден нулевой байт. <br>
ABCDCBA0á´¿á´¿®
для (((((65 << 8) + 66) << 8) + 67) << 8) + 68; </p>
Эти результаты были получены на процессоре с прямым порядком байтов с 8-битным размером атомного элемента и 1-байтовым приращением адреса, где 32-битное целое число 40 (0x28 в шестнадцатеричном) представлено как 0x28-0x00-0x00-0x00
(LSB) на самый низкий адрес). Результаты могут отличаться от компилятора к компилятору и от платформы к платформе.
Теперь, если вы попытаетесь раскомментировать фиктивную декларацию, вы обнаружите, что все выходные данные имеют вид ABC-randomchars-char_corresponding_to_an_int
. Это снова результат неопределенного поведения.