Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/48: Рейтинг темы: голосов - 48, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13

Что такое ' ' (апострофы)

16.08.2011, 19:52. Показов 9530. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Да, я знаю что
C++
1
char c = '1'; // == 48
А вот что такое '1234' и почему нельзя '12345'?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2011, 19:52
Ответы с готовыми решениями:

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

22
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
16.08.2011, 19:55
В символах апострофа заключают символьные литералы (т.е. один однобайтовый символ)
char c = '1' - можно.
char c = '1234' - нельзя!
char c = '12345' - тоже нельзя!.
1234 - это строковый литерал (т.е. строка символов). Его заключают в двойные кавычки.
0
Заблокирован
16.08.2011, 19:57
Цитата Сообщение от jerdeks Посмотреть сообщение
Да, я знаю что
C++
1
char c = '1'; // == 48
А вот что такое '1234' и почему нельзя '12345'?
Честно говоря, так как нет под рукой стандарта, то придется говорить по памяти. Не помню, как в С++, но в С типом символьного литерала является целое число. То есть символьный литерал '1234' - это целое число.

Например,

C++
1
int x = '1234';

Это корректная запись. А при присвоении '12345' происходит потеря значения, поэтому наверное и выдает ошибку. Если бы у меня под рукой был стандарт, я бы вам точнее ответил.

Добавлено через 1 минуту
Цитата Сообщение от Nameless One Посмотреть сообщение
В символах апострофа заключают символьные литералы (т.е. один символ!)
1234 - это строковый литерал. Его заключают в двойные кавычки.
Вы не правы! Это не строковый литерал, а символьный литерал, имеющий тип
C++
1
int
. По крайней мере так в языке С.
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
16.08.2011, 20:01
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вы не правы! Это не строковый литерал, а символьный литерал, имеющий тип
Да, извиняюсь, в данном случае это будет многознаковая символьная константа.
0
16.08.2011, 20:04

Не по теме:

Чет давненько то не был, в какую тему не зайду - везде вы доказываете, что кто-то не прав :D

0
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13
16.08.2011, 20:04  [ТС]
Кстати, в инт записывается наоборот, не 1234, а 4321. И вот ещё что интересно. В Си можно написать хоть 'dfskhjdgrfohidgfsobhidgfdgfuohidgfs' - будет только варнинг, что "слишком много для данного типа", а в Си++ больше 4х символов - генерирует ошибку, с текстом почти как сишный варнинг
0
16.08.2011, 20:06

Не по теме:

Цитата Сообщение от KuKu Посмотреть сообщение
Чет давненько то не был, в какую тему не зайду - везде вы доказываете, что кто-то не прав
ну так это ж хорошо :D главное только чтобы доказывали с аргументами, а не так, как у нас часто бывает, - с пеной у рта :D

0
Заблокирован
16.08.2011, 20:07
Цитата Сообщение от jerdeks Посмотреть сообщение
Кстати, в инт записывается наоборот, не 1234, а 4321. И вот ещё что интересно. В Си можно написать хоть 'dfskhjdgrfohidgfsobhidgfdgfuohidgfs' - будет только варнинг, что "слишком много для данного типа", а в Си++ больше 4х символов - генерирует ошибку, с текстом почти как сишный варнинг
Это не обязательно, что '1234' будет представлено в памяти как 4321. Это зависит от представления чисел в памяти, так наызваемых little indian и big indian форматов.

Да, между С и С++ есть существенные различия. Например, в С следующая запись
C++
1
char s[3] = "ABC";
корректная, в то время как в С++ такая запись

C++
1
char s[3] = "ABC";
не корректная. В С++ должно быть

C++
1
char s[4] = "ABC";
То есть в С++ размер массива должен равняться не 3, а 4.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
16.08.2011, 20:13
Цитата Сообщение от jerdeks Посмотреть сообщение
Кстати, в инт записывается наоборот, не 1234, а 4321
и не то и не другое '1'=0x31 и т.д
порядок поменятся в памяти а в переменной нет
Миниатюры
Что такое ' ' (апострофы)  
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
16.08.2011, 20:16
Цитата Сообщение от Сыроежка Посмотреть сообщение
так наызваемых little indian и big indian
Маленький и большой индийский? Это как-нибудь связано с индусами? Шутка.
1
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13
16.08.2011, 20:19  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это не обязательно, что '1234' будет представлено в памяти как 4321. Это зависит от представления чисел в памяти, так наызваемых little indian и big indian форматов.
Угу.
Но с огроменными символьными литералами в си так и не понял.

Добавлено через 2 минуты
ValeryS, ну да-да, правильно. Я-то именно в памяти смотрел:
C++
1
2
3
4
int x = '1234';
    for (int i = 0; i < 4; i++)
        cout << *((char*)&x + i) << '\t';
    // 4  3  2  1
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
16.08.2011, 21:16
самое главное не это
смотри сркиншот
при int a='1234'
в переменную запишется
i=0x31323334
т.е в переменной будут HEX значения символов
0
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13
16.08.2011, 22:12  [ТС]
ValeryS, это-то ясно
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
16.08.2011, 22:25
Цитата Сообщение от jerdeks Посмотреть сообщение
ValeryS, ну да-да, правильно. Я-то именно в памяти смотрел:
C++
1
2
3
4
 int x = '1234';
 for (int i = 0; i < 4; i++)
 cout << *((char*)&x + i) << '\t';
 // 4 3 2 1
Дело в том, что например число 0x1234, будет хранится в памяти как 0x4321. На первый взгляд кажется бред, но на самом деле все логично - младший байт хранится по младшему адресу, старший - по старшему.
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
17.08.2011, 00:07
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дело в том, что например число 0x1234, будет хранится в памяти как 0x4321.
Тогда уж как 0x34, 0x12. Всё-таки 8 бит это 2 шестнадцатиричные цифры, да и объединять их тогда не стоит, а то снова 0x1234 получиться должно. Но '1234' это не 0x1234, это 0x31323334, то есть, в little-endian, последовательность байт 0x34, 0x33, 0x32, 0x31.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.08.2011, 06:17
C89(draft) 3.1.3.4 Character constants
грамматика символьных констант
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
3.1.3.4 Character constants
 
Syntax
 
          character-constant:
                  ' c-char-sequence' 
                  L' c-char-sequence' 
 
          c-char-sequence:
                  c-char
                  c-char-sequence c-char
 
          c-char:
                  any member of the source character set except
                   the single-quote ', backslash \, or new-line character
                   escape-sequence
 
          escape-sequence:
                  simple-escape-sequence
                  octal-escape-sequence
                  hexadecimal-escape-sequence
 
          simple-escape-sequence: one of
                  \'  \"  \?  \\
                  \a  \b  \f  \n  \r  \t  \v
 
          octal-escape-sequence:
                  \  octal-digit
                  \  octal-digit octal-digit
                  \  octal-digit octal-digit octal-digit
 
          hexadecimal-escape-sequence:
                  \x  hexadecimal-digit
                  hexadecimal-escape-sequence hexadecimal-digit
 
...
 
The value of an integer character constant containing more
than one character, or containing a character or escape sequence not
represented in the basic execution character set, is
implementation-defined.
0
17.08.2011, 07:48

Не по теме:

Цитата Сообщение от grizlik78 Посмотреть сообщение
Тогда уж как 0x34, 0x12. Всё-таки 8 бит это 2 шестнадцатиричные цифры, да и объединять их тогда не стоит, а то снова 0x1234 получиться должно. Но '1234' это не 0x1234, это 0x31323334, то есть, в little-endian, последовательность байт 0x34, 0x33, 0x32, 0x31.
Да, конечно же! Просто уже ночью писал:)

0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
17.08.2011, 09:31
Цитата Сообщение от Сыроежка Посмотреть сообщение
Не помню, как в С++, но в С типом символьного литерала является целое число. То есть символьный литерал '1234' - это целое число.
В C++ символьный литерал имеет тип char (чтобы работали перегруженные функции).
Страуструп пишет в своей книжке, что литерал с несколькими символами в одиночных кавычках архаичен, его интерпретация зависит от реализации, и его следует избегать.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.08.2011, 18:57
Цитата Сообщение от jerdeks Посмотреть сообщение
А вот что такое '1234' и почему нельзя '12345'?
'1234' - одиночный символ 1234, но такого символа нет и быть не может. А "1234" - это строка из '1', '2', '3' и '4', собранных вместе.

Добавлено через 4 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это корректная запись. А при присвоении '12345' происходит потеря значения, поэтому наверное и выдает ошибку.
Нет. Потеря битов выдаётся в напоминаниях, а не в ошибках. '12' - уже нельзя, так как 1 и 2 - два символа, а в апостроф заключается один, значением будет его код (потому '1' и равно 48, а не 1). А двум символам 1 и 2 сразу код не присвоен. Кстати, дефолтная разрядность 1 байт, 1234 туда тоже не влезет.
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
17.08.2011, 19:15
Цитата Сообщение от taras atavin Посмотреть сообщение
Кстати, дефолтная разрядность 1 байт
Кстати, байт в терминах языка си никак не может быть разрядностью, ибо не обязан состоять ровно из 8 битов По сути char и byte являются синонимами в том смысле, что размер char ровно один байт. Но битов в байте может быть и больше 8.

Добавлено через 10 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
'1234' - одиночный символ 1234, но такого символа нет и быть не может.
Это не одиночный символ, это multicharacter literal. И как уже здесь говорилось, тип многосимвольного литерала есть int.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2011, 19:15
Помогаю со студенческими работами здесь

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

Апострофы в условии
Доброго времени, вопрос следующий: Как, в условии if сравнивать символы с апострофом? я никак не могу понять как его обозначить Заранее...

Кавычки и апострофы
Кавычки и апострофы в C++ работают как и в пхп? Кавычки- весь внутренний код прогоняется как программный, затем образуется строка. ...

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Что такое перегрузка оператора? Что у меня в коде за ошибка?
Что же я написал?? Что оно не компилится? Что значит error C2275: Superclass: недопустимое использование этого типа в качестве выражения ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru