Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Вроде некорректное отображение длины символьных ко


Автор: Mastodont 13.11.2009, 08:46
В книге "Язык С++" Подбельского есть код для определения длины внутренних представлений символьных констант.
Код
//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

Вроде код правильно написал. Есть ли у меня ошибка?

Автор: Platov 13.11.2009, 09:50
Всё правильно оно посчитало!

'\\n\\t' - это и есть 4 символа, а вот '\n\t' это уже 2

Автор: Mastodont 16.11.2009, 08:11
Цитата

Всё правильно оно посчитало!

'\\n\\t' - это и есть 4 символа, а вот '\n\t' это уже 2

Выходит, у Подбельского опечатка?

Автор: Platov 16.11.2009, 13:48
Пробовал такой код:
Код

Button1->Caption=String(sizeof("/r/n")-1);


получается 2 что соответствует действительности. Возможно опечатка в том что кавычки одинарные.

Автор: Mastodont 16.11.2009, 14:20
Цитата

Возможно опечатка в том что кавычки одинарные

А должны быть двойные?

Автор: SenkraD 16.11.2009, 14:48
Mastodont,  sizeof('\n\t') == 4
Код
2.13.2/1A 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.

Автор: Platov 16.11.2009, 17:06
SenkraD, /r/n это 2 байта! Это обычные однобайтовые символы. Это можно увидеть в обычном текстовом файле в hex-ах.

Автор: SenkraD 16.11.2009, 17:20
Platov,  я сылку с стандарта для кого дал? Вот выделил жирным
Код
2.13.2/1A 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.

Автор: Platov 16.11.2009, 20:37
Мы с SenkraD посоветовались и пришли к выводу что всётаки в книге очепятка в кавычках - нужны двойные.

Автор: SenkraD 16.11.2009, 20:49
Я ещё раз перепроверил и прищёл к выводу, что книга писалась либо
на компилере, который поддерживал старый стандарт (я его не знаю),
либо программы тестировались на машине, где sizeof(int) == 2

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