Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Char или String ?


Автор: hoz 29.1.2014, 19:05
 Как я понимаю тип char судя по учебникам служит для хранения символов. Прочитал кроме того http://adorning.ru/2010/01/10/c-urok-6-stroki/, и всё-таки запутался.
 В статье сказано:
Цитата

Если кто не помнит, то переменная типа char хранит в себе 1 символ.

А дальше код:
Код

char name[50];

cin>>name;

cout<<"Hello "<<name<<endl;

Получается, что в массиве будет 50 элементов разером в 1 символ? Т.е. 50 символов(грубо говоря по 1-ой цифре или букве, ну или знаку разумеется каком-нить), верно?

Автор: vinter 29.1.2014, 19:59
Верно. Но если ты не записывал туда символы, то там будет мусор(тоже символы, но малопредсказуемые). Тип char служит для хранения данных размеров в 1 байт(не совсем точно, но для большинства систем это так). Разумеется ты можешь хранить там как символы, так и то, что не имеет для тебя символьной нагрузки, например:
Код

char byte = 0xff;

Т.е. воспринимай char как тип размером в 1 байт и помни, что char, char*, char[], как правило, интерпретируются различными стандартными функциями как символ и строка(набор символов) соответственно. Но это не означает, что они могут интерпретироваться только так. Это вопрос использования.

Автор: trinitr0 30.1.2014, 10:00
тип char - это специальный объект, знимающий один байт в памяти и способный хранить небольшие целые числа 
(со знаком 'char': -128 до 127 и без 'unsigned char': 0 до 255):

Код

char a = 127;


эквивалтно:

Код

char a = 'a';



Автор: hoz 30.1.2014, 10:01
Цитата(vinter @  29.1.2014,  19:59 Найти цитируемый пост)
Верно. Но если ты не записывал туда символы, то там будет мусор(тоже символы, но малопредсказуемые).

Откуда там будет мусор то? Ведь если не инициализировать явно, то, по крайне мере, в языках программирования нулём инизиализируются переменные, НО как может быть малопредсказуемое значение то?


Цитата(vinter @  29.1.2014,  19:59 Найти цитируемый пост)
Т.е. воспринимай char как тип размером в 1 байт и помни, что char, char*, char[], как правило, интерпретируются различными стандартными функциями как символ и строка(набор символов) соответственно. 

А вот как char, char*, char[] воспринимать не как символ, а как строку для меня сложновато понять. Ведь тип в 1 байт. И изначальная трактовка использования данного типа для работы с символами.

Автор: vinter 30.1.2014, 11:35
Цитата(hoz @  30.1.2014,  11:01 Найти цитируемый пост)
 Ведь если не инициализировать явно, то, по крайне мере, в языках программирования нулём инизиализируются переменные

Ты ошибаешься. Языки программирования не надо объединять, у каждого свои правила. C++, в общем случае, ничего нулём не инициализирует. Для подобной инициализации должны быть специальные условия(глобальные переменные и т.п.)
Цитата(hoz @  30.1.2014,  11:01 Найти цитируемый пост)
А вот как char, char*, char[] воспринимать не как символ, а как строку для меня сложновато понять. Ведь тип в 1 байт. И изначальная трактовка использования данного типа для работы с символами.

C++ довольно низкоуровневый язык, в ассемблере вообще нет типов, есть разное количество памяти выделенное под некую сущность. C++ просто имеет имена для наиболее популярных размеров. Так char это имя для куска памяти размером в 1 байт. Так уж повелось, что он еще и представляет ASCII и поэтому, вероятно, называется char. Это просто принято хранить символы в char и интерпретировать переменные типа char как символьные, но это не правило, это просто традиция.

Так как набор символов представляет собой строку, то и в C++ это так: если у тебя есть массив char(char[]), то это можно интерпретировать как строку. Тоже самое с указателем. 

Автор: borisbn 30.1.2014, 16:36
Цитата(vinter @  29.1.2014,  19:59 Найти цитируемый пост)
Тип char служит для хранения данных размеров в 1 байт(не совсем точно, но для большинства систем это так)

По стандарту
Цитата
The sizeof operator yields the number of bytes in the object representation of its operand.
...
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.

Хотя, действительно, я сталкивался с одной специфической платформой, у которой sizeof( char ) равнялся 4.

Автор: vinter 30.1.2014, 17:08
Цитата(borisbn @  30.1.2014,  17:36 Найти цитируемый пост)
По стандарту

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

Автор: borisbn 30.1.2014, 17:23
Doc No: N1905=05-0165
Date: 2005-10-19
Пункт 5.3.3 (Sizeof). Подпункт 1.

Автор: vinter 30.1.2014, 18:23
Точно, вспомнил, это размер байта в стандарте не определён. Спасибо за напоминание.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)