Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/17: Рейтинг темы: голосов - 17, средняя оценка - 4.94
jerdeks
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13
#1

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

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

Да, я знаю что
C++
1
char c = '1'; // == 48
А вот что такое '1234' и почему нельзя '12345'?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2011, 19:52
Ответы с готовыми решениями:

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

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

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

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

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

22
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
16.08.2011, 19:55 #2
В символах апострофа заключают символьные литералы (т.е. один однобайтовый символ)
char c = '1' - можно.
char c = '1234' - нельзя!
char c = '12345' - тоже нельзя!.
1234 - это строковый литерал (т.е. строка символов). Его заключают в двойные кавычки.
0
Сыроежка
Заблокирован
16.08.2011, 19:57 #3
Цитата Сообщение от 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
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
16.08.2011, 20:01 #4
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вы не правы! Это не строковый литерал, а символьный литерал, имеющий тип
Да, извиняюсь, в данном случае это будет многознаковая символьная константа.
0
KuKu
16.08.2011, 20:04
  #5

Не по теме:

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

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

Не по теме:

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

0
Сыроежка
Заблокирован
16.08.2011, 20:07 #8
Цитата Сообщение от 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
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
16.08.2011, 20:13 #9
Цитата Сообщение от jerdeks Посмотреть сообщение
Кстати, в инт записывается наоборот, не 1234, а 4321
и не то и не другое '1'=0x31 и т.д
порядок поменятся в памяти а в переменной нет
0
Миниатюры
Что такое ' ' (апострофы)  
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
16.08.2011, 20:16 #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
так наызваемых little indian и big indian
Маленький и большой индийский? Это как-нибудь связано с индусами? Шутка.
1
jerdeks
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13
16.08.2011, 20:19  [ТС] #11
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это не обязательно, что '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
ValeryS
Модератор
7163 / 5430 / 674
Регистрация: 14.02.2011
Сообщений: 18,334
16.08.2011, 21:16 #12
самое главное не это
смотри сркиншот
при int a='1234'
в переменную запишется
i=0x31323334
т.е в переменной будут HEX значения символов
0
jerdeks
1 / 1 / 0
Регистрация: 19.04.2009
Сообщений: 13
16.08.2011, 22:12  [ТС] #13
ValeryS, это-то ясно
0
Kastaneda
Jesus loves me
Эксперт С++
4763 / 2966 / 342
Регистрация: 12.12.2009
Сообщений: 7,531
Записей в блоге: 2
Завершенные тесты: 1
16.08.2011, 22:25 #14
Цитата Сообщение от 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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
17.08.2011, 00:07 #15
Цитата Сообщение от Kastaneda Посмотреть сообщение
Дело в том, что например число 0x1234, будет хранится в памяти как 0x4321.
Тогда уж как 0x34, 0x12. Всё-таки 8 бит это 2 шестнадцатиричные цифры, да и объединять их тогда не стоит, а то снова 0x1234 получиться должно. Но '1234' это не 0x1234, это 0x31323334, то есть, в little-endian, последовательность байт 0x34, 0x33, 0x32, 0x31.
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
17.08.2011, 06:17 #16
C89(draft) 3.1.3.4 Character constants
грамматика символьных констант
Код
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
Kastaneda
17.08.2011, 07:48
  #17

Не по теме:

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

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

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

Добавлено через 10 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
'1234' - одиночный символ 1234, но такого символа нет и быть не может.
Это не одиночный символ, это multicharacter literal. И как уже здесь говорилось, тип многосимвольного литерала есть int.
0
17.08.2011, 19:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2011, 19:15

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru