Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2009, 08:46   #1
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию Вроде некорректное отображение длины символьных констант

В книге "Язык С++" Подбельского есть код для определения длины внутренних представлений символьных констант.
Код:
//P2-04 длины внутренних представлений символьных констант
#include <iostream.h>
#include <windows.h>

int rustext(char str[])
{
 CharToOem(str,str);
 cout << str;
}

void main()
{
 rustext("\n Длины символьных (литерных) констант (в байтах): ");
 cout << "\nsizeof\'z'\ = " << sizeof 'z';
 cout << "\nsizeof\'\\n\' = " << sizeof '\n';
 cout << "\nsizeof\'\\n\\t'\ = " << sizeof '\n\t';
 cout << "\nsizeof\'\\x07\\x07\' = " << sizeof '\x07\x07';
 cout << "\nsizeof\'\\x4F\' = " << sizeof '\x4F';
 cout << "\nsizeof\'\\111\' = " << sizeof '\111';
 rustext("\nДесятичное значение кода символа ");
 cout << "\'\\x0004F\' = " << (int)'\x0004F';
 rustext("\nДесятичное значение кода символа ");
 cout << "\'\\x4F\' = " << (int)'\x4F';
 rustext("\nДесятичное значение кода пробела = ");
 cout << (int)' ' << "\n";

 system("pause");
}
У меня получается вывод
Цитата:
Длины символьных (литерных) констант (в байтах):
sizeof'z' = 1
sizeof'\n' = 1
sizeof'\n\t' = 4
sizeof'\x07\x07' = 4
sizeof'\x4F' = 1
sizeof'\111' = 1
Десятичное значение кода символа '\x0004F' = 79
Десятичное значение кода символа '\x4F' = 79
Десятичное значение кода пробела = 32
Для продолжения нажмите любую клавишу . . .
А у Подбельского
Цитата:
sizeof'\n\t' = 2
sizeof'\x07\x07' = 2
Вроде код правильно написал. Есть ли у меня ошибка?
fs444 вне форума Ответить с цитированием
Старый 13.11.2009, 09:51   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Я не знаю что это такое '\n\t' и как оно приводится к int, но оно почему-то именно как int воспринимается компилятором VS 2008. Попробуй написать:
Код:
char c = '\n\t';
У меня ругается, что усечение происходит с int до char.
Ну а раз это int, то и размер у него 4. У Подбельского этот ужас может к short компилятором приводился и потому у него 2. Но что это за запись такая я не понимаю, может кто-то просвятит как это символ из двух символов может состоять?
pu4koff вне форума Ответить с цитированием
Старый 13.11.2009, 11:00   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от triton Посмотреть сообщение
Это ча. Так что выбрось студию.
Ну-ну. Как будем записывать два байта в один? Это студия одна наверно такая корявая, что не умеет этого, но другие компиляторы на раз такое провернут конечно же...
Опытным путём выяснилось, что можно так указывать до 4-х символов (int 4 байта, а char - 1, т.е. как бы всё сходится). При этом наблюдается следующее:
Код:
int i = '\x5\x1\x0\x0'; // i == 261, т.е. 5 + 1*256
i = '\x5\x2\x0\x0'; // i == 517, т.е. 5 + 2*256
Получается, что int можно так задавать побайтово.

Ссылочку на стандарт языка тут подкинули:
Цитата:
2.13.2/1
A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by the letter L, as in L’x’. A character literal that does not begin with L is an ordinary character literal, also referred to as a narrow-character literal. An ordinary character literal that contains a single c-char has type char, with value equal to the numerical value of the encoding of the c-char in the execution character set.
An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.
Так что всё правильно. '\n\t' - это получается multicharacter literal, а потому имеет тип int.

ЗЫ. Не надо говорить мне что делать и я не скажу, куда тебе идти
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректное отображение времени в ячейке Arkuz БД в Delphi 2 19.07.2009 02:18
Windows 7 некорректное отображение кирилицы Stilet Windows 6 07.05.2009 13:31
Некорректное отображение 3d объекта, экспортированного в Delphi Bellataminal Помощь студентам 3 16.02.2009 09:34
некорректное отображение ZYRGiX JavaScript, Ajax 1 21.01.2008 18:15