Собственно, подумайте об этом в другом случае. Предположим, что если ваш список таков:
[[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
. Вот почему все списки первых элементов изменены.
Поскольку char
массивы обрабатываются по-разному с другими массивами, когда вы передаете их на cout
- оператор <<
перегружен для const char*
. Это для совместимости с C, так что массивы char
с нулевым завершением рассматриваются как строки.
См. этот вопрос .
Это связано с интегральным продвижением . Когда вы вызываете двоичный файл +
с 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;
См. этот вопрос .
Хорошо, давайте переходим друг к другу.
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
, вы просто видите номер.
+
оператор, перед шагом, о котором вы говорите, применяются рекламные акции по умолчанию. I>. Все интегральные типы, более узкие, чемint
, продвигаются доint
. Например,'A' + 'B'
также имеет типint
(неchar
). – M.M 1 June 2014 в 04:05char
иint
несоответствие, необходимо принять решение об конвертации одного в другое. Это неправда; сначала появляются рекламные акции по умолчанию (есть ли несоответствие или нет). Если ваша логика была правильной, тогда'A' + 'B'
будетchar
. – M.M 2 June 2014 в 04:09int
может быть либоsigned
, либоunsigned
. – JBentley 2 June 2014 в 09:47