Почему использование только имени массива символов печатает весь массив [duplicate]

Собственно, подумайте об этом в другом случае. Предположим, что если ваш список таков:

[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]

, и если вы напишете myList[0][0] = 5, вы получите:

>>> 
[[5, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
>>> 

Как и ожидалось. Но так как вы определяете свою переменную списка следующим образом:

[[1] * 4] * 3

Python обработает ваши коды по этому шаблону. Поэтому, если вы напишете myList[0][0] и ваш список, как указано выше, Python обработает его, как [1]*3. Вот почему все списки первых элементов изменены.

0
задан JBentley 31 May 2014 в 22:20
поделиться

2 ответа

1.

Поскольку char массивы обрабатываются по-разному с другими массивами, когда вы передаете их на cout - оператор << перегружен для const char*. Это для совместимости с C, так что массивы char с нулевым завершением рассматриваются как строки.

См. этот вопрос .

2.

Это связано с интегральным продвижением . Когда вы вызываете двоичный файл + с char (со значением «a») и int (со значением 1), компилятор продвигает ваш char к signed int или unsigned int. Какой из них специфичен для реализации - это зависит от того, подписан ли char по умолчанию или без знака, и который int может принимать весь диапазон char. Таким образом, оператор + вызывается со значениями «97» и «1», и он возвращает значение «98». Чтобы напечатать это как char, вам нужно сначала набросить его:

cout << "Print char array[0]+1: " << static_cast<char>(array[0]+1) << endl;

См. этот вопрос .

2
ответ дан Community 21 August 2018 в 07:22
поделиться
  • 1
    Ваше объяснение части 2 неверно. Когда используется неперегруженный + оператор, перед шагом, о котором вы говорите, применяются рекламные акции по умолчанию. . Все интегральные типы, более узкие, чем int, продвигаются до int. Например, 'A' + 'B' также имеет тип int (не char). – M.M 1 June 2014 в 04:05
  • 2
    @MattMcNabb Можете ли вы пояснить, как это противоречит тому, что я написал? – JBentley 1 June 2014 в 11:30
  • 3
    вы сказали, что, поскольку char и int несоответствие, необходимо принять решение об конвертации одного в другое. Это неправда; сначала появляются рекламные акции по умолчанию (есть ли несоответствие или нет). Если ваша логика была правильной, тогда 'A' + 'B' будет char. – M.M 2 June 2014 в 04:09
  • 4
    @mattmcnabb Хорошо спасибо. Я отредактировал свой вопрос, чтобы принять во внимание ваш комментарий, а также указать, что int может быть либо signed, либо unsigned. – JBentley 2 June 2014 в 09:47

Хорошо, давайте переходим друг к другу.

Print int array: 0xbfd66a88

Здесь вы печатаете int [], который переходит в перегрузку operator <<, которая принимает int *. И когда вы печатаете указатель, вы видите адрес памяти в шестнадцатеричном формате.

Print int array[0]: 5

Здесь вы печатаете первый элемент массива, который является int. Как и ожидалось.

Print int array[0]+1: 6

Здесь вы добавляете 1 к первому элементу массива и печатаете результат, который по-прежнему остается int. 5 + 1 становится 6. Нет таинственности здесь.

Print char array: abcd

Это немного сложнее. Вы печатаете char[], и есть специальная перегрузка для operator <<, которая принимает const char* и вызывает вызов. То, что делает эта перегрузка, - это печатать каждый символ, начиная с адреса, где указатель указывает до тех пор, пока он не найдет нулевой конец.

Print char array[0]: a

Здесь вы печатаете char, поэтому вызывается перегрузка, которая принимает char , Он печатает соответствующий символ ASCII, который является «a».

Print char array[0]+1: 98

Здесь результатом operator+ является int, потому что буква 1 является значением int и char повышается до более широкого типа (int). Результат равен 98, потому что код ASCII буквы «a» равен 97. Когда вы печатаете int, вы просто видите номер.

1
ответ дан isarandi 21 August 2018 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: