Почему следующий блок кода выдает «ZZZ (некоторое значение мусора)» вместо «ZZ (некоторое значение мусора)» - PullRequest
0 голосов
/ 28 октября 2019

При печати & a (cout<<&a) компилятор выводит «Z», но когда мы печатаем символ перед печатью адреса символа, он выводит (cout<<a<<" "<<&a) как «Z ZZ». Я знаю, что cout обрабатывает адрес символа по-разному, то есть, получая адрес символа, он не печатает этот адрес, а печатает содержимое, находящееся по этому адресу. Пожалуйста, помогите мне с концепцией, которую я здесь скучаю. Вот фрагмент кода:

#include <iostream>
using namespace std;
int main() {
    char a = 'Z';
    cout<<a<<&a;
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 28 октября 2019
char a = 'Z';
cout << &a;

Это обрабатывает адрес a как адрес строки с нулевым символом в конце и печатает эту строку. Поскольку это не указатель на строку с нулевым символом в конце (это указатель на один char), в вашей программе есть неопределенное поведение.

Неопределенное поведение означает, что программа не имеет определенного поведения,то есть он может иметь любое поведение: он может печатать мусор, он может печатать другой мусор, он может ничего не печатать, он может аварийно завершить работу или почти любое поведение.

2 голосов
/ 28 октября 2019

Если вы хотите вывести адрес переменной a, напишите

char a = 'Z';
cout << a << static_cast<void *>( &a );

В противном случае компилятор попытается вывести строку, на которую указывает выражение &a, которая имеет тип char *пока не встретится завершающий ноль символ.

Таким образом, этот вывод

cout << &a;

имеет неопределенное поведение.

Если вы хотите вывести переменную a в виде массива, имеющегоЗатем нужно объявить массив вместо скалярной переменной и инициализировать его строковым литералом вместо символьного литерала. Например

char a[] = "Z";
cout << *a << &a;
...