Почему тут так работает в с++ - Вопросы по С+

Вопрос Почему тут так работает в с++

Регистрация
17 Окт 2013
Сообщения
101
Репутация
1
Спасибо
0
Монет
0
Почему чтоб вывести элементы числового массива , то это надо выполнять через цикл , а чтоб вывести строку , то можно написать cout << название строки и все ? Вот пример:

char string[ ]={'H' , 'I' , '\0'};

cout <<string; , почему тут выводится полностью слово HI , в то время как если числовой массив так же вывести , то выводится просто адрес первого элемента массива
 
Регистрация
21 Дек 2013
Сообщения
74
Репутация
1
Спасибо
0
Монет
0
string и char* по стандарту являются текстовыми строками, поэтому все операторы и функции вывода на stdout уже включают в себя цикл для "печати" всей строки целиком.
Числовые массивы обычно не содержат информацию для интерпретации их как ряда чисел (исключение - учебные цели), а если и содержат то требуют тщательных методов форматирования (например пробел между числами или каждое в новой строке или построение таблицей и т.д.), поэтому стандарт отдает интерпретацию числовых массивов на откуп программисту.
 
Регистрация
25 Авг 2013
Сообщения
92
Репутация
0
Спасибо
0
Монет
0
Потому что для строки всегда известна или может быть подсчитана ее длина, а для обычных массивов - необязательно. В функцию, например, передается только указатель на начало массива.
 
Регистрация
22 Дек 2013
Сообщения
75
Репутация
0
Спасибо
0
Монет
0
Вывод строк

При выводе массива символов (строки) с помощью `cout << string;` происходит следующее:

1. Оператор `<<` для `cout` имеет специальную перегрузку для работы с типом `const char*`.
2. Когда вы передаете массив символов в `cout`, он неявно преобразуется в указатель на первый элемент массива.
3. Эта перегрузка оператора знает, что нужно выводить символы последовательно, пока не встретится нулевой символ (`'\0'`), который означает конец строки.

Поэтому в примере:
char string[] = {'H', 'I', '\0'};
cout << string;

Выводится "HI", так как `cout` продолжает выводить символы до тех пор, пока не встретит нулевой символ.

Вывод числовых массивов

С числовыми массивами ситуация иная:

1. Для числовых типов нет специальной перегрузки оператора `<<`, которая бы интерпретировала массив как последовательность чисел.
2. При попытке вывести числовой массив, например `int arr[] = {1, 2, 3};`, выражение `arr` преобразуется в указатель на первый элемент массива.
3. `cout` выводит этот указатель как адрес в памяти, а не содержимое массива.

Почему так сделано

1. **Историческая причина**: В C строки представлялись как массивы символов, заканчивающиеся нулевым символом. Эта концепция была унаследована C++.

2. **Эффективность**: Для строк это удобно, так как часто нужно выводить весь текст. Для числовых массивов такой подход менее универсален, так как может потребоваться выводить только часть массива или в особом формате.

3. **Гибкость**: Для числовых массивов предпочтительнее использовать циклы, что дает больше контроля над форматом вывода и позволяет обрабатывать массивы произвольной длины.

Чтобы вывести числовой массив, вам нужно использовать цикл:
int arr[] = {1, 2, 3};
for (int i = 0; i < 3; ++i) {
cout << arr << " ";
}

Это дает больше гибкости при работе с числовыми данными.
 
Регистрация
29 Ноя 2012
Сообщения
71
Репутация
0
Спасибо
0
Монет
0
в с и с++ специально сделали такую функцию вывода удобную, чтобы людям для вывода текста не пришлось писать все элементы массива. Так же ты можешь для массива символов просто вписать слово и оно заполнится как надо char string[ ]={'Hello World!'};
 
Сверху Снизу