С рссматривает символьные константы как тип int, а не char (Как вам это нравится?)

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Вы-то, наверное в недоумении, а мне-то каково? Я неделю бьюсь над char и int, наконец, начинаю кое-что понимать (что разделение на эти типы в Pascale довольно условно, но ещё более условно оно в C, что, вообще-то ввод любого из символов есть по сути ускоренный ввод целого числа от 0 до 255, что можно было бы тип char и не придумывать, но тогда любой из символов занимал бы в памяти столько места, сколько занимает сейчас число типа int- 32 бита ну, или 16 на худой конец, а так придумали тип char, определили место под переменную этого типа- 8 бит- глядишь, память и сэкономили... И на тебе, сюрприз:

"Несколько странным являетя тот факт, что С рассматривает символьные константы как тип int, а не char."

Не знаю даже, как вопрос поставить... Так он после таких заявлений существует или нет, этот char, если он не нужен вообще, если все символьные костанты рассматриваются как int?

Да, чуть не забыл.. Стивен Прата, "Язык программирования С. Лекции и упражнения"
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С рссматривает символьные константы как тип int, а не char

Сообщение drBatty »

во первых char придумали для того, что бы отделить числа от символов, тип char это число со знаком в которое точно войдёт 1 символ, ещё известно, что он не больше int'а, вобщем то и всё. У нас char это число -128...127. А символьная константа действительно рассматривается как int например у нас '/0' абсолютно то же самое что и просто 0. Только не путай c "xxx" это совсем другая константа, её тип char *(скорее const char*).
Что вобщем то не делает незаконными такие вещи:

Код: Выделить всё

int i = '@';
char c = -55;

если тебе нравятся символы 0...255 используй тип unsigned char, незабывая о том, что все используют просто char, именно по этому 'Ж' < 'Q' и 'Ж' < '/0'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

drBatty писал(а):
27.10.2007 19:15
А символьная константа действительно рассматривается как int например у нас '/0' абсолютно то же самое что и просто 0

Что это значит?
Попробую сам ответить: это значит, что для представления символа в памяти машины выделено 4 или 2 байта. А тип char- тот однобайтовый, для хранения символьных костант не используется теперь. Так он для чего тогда?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Red User »

promov писал(а):
27.10.2007 19:38
А тип char- тот однобайтовый, для хранения символьных костант не используется теперь.


Почему? Вполне себе используется. Можно присвоить переменной типа char символьную константу. Просто при этом, по-видимому, происходит приведение типа.

Код: Выделить всё

$ cat testing.c
#include <stdio.h>

int main()
{
    char ch = 'Z';

    printf("%d\n", sizeof(ch));
    printf("%c\n", ch);
    printf("%d\n", sizeof('Z'));

    return 0;
}

$ gcc testing.c
$ ./a.out
1
Z
4
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
s0urce
Сообщения: 321
ОС: Arch Linux + WinXP

Re: С рссматривает символьные константы как тип int, а не char

Сообщение s0urce »

А тип char- тот однобайтовый, для хранения символьных костант не используется теперь. Так он для чего тогда?
страшную тайну открою тебе, компьютер вообще не про какие символы понятия не имеет, у него всё есть число, поэтому твоё удивление несколько странно...
а для чего нужен char? а для удобства, человек же не компьютер и ему x=' ' гораздо понятнее, чем x=32. А приводится этот тип к int, потому что процессор быстрее всего обрабатывает операции именно с типом int, т.к. он соответствует размеру 1 регистра процессора...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С рссматривает символьные константы как тип int, а не char

Сообщение drBatty »

promov писал(а):
27.10.2007 19:38
drBatty писал(а):
27.10.2007 19:15
А символьная константа действительно рассматривается как int например у нас '/0' абсолютно то же самое что и просто 0

Что это значит?
Попробую сам ответить: это значит, что для представления символа в памяти машины выделено 4 или 2 байта. А тип char- тот однобайтовый, для хранения символьных костант не используется теперь. Так он для чего тогда?

Надо просто понять: константы отличаются от выражений. Те константы(цифры и буквы) что ты пишешь в программе обрабатоваются компилятором и записоваются в выражения. К примеру, если ты напишешь

Код: Выделить всё

int x = 7;
int y = x/2;
компилятор вправе записать по адресу &y сдвинутое вправо значение x

Код: Выделить всё

 int x;
int y = x >> 1;

а может вообще сделать так:

Код: Выделить всё

int x = 7; int y = 3;
где тут вообще двойка? Можно видеть, что эта константа просто исчезла, причём никакого преобразования типов не было. Речь идёт о том, что символьная константа используется по контексту, а если контекст непонятен - как целое. Это очень удобно, если твои символы больше 127(например однобайтовые русские буквы или юникод или '\xff') Кроме того, вопрос о том, сколько байт выделено константе не имеет смысла. Константа она в тексте, а в программе такой константы може вообще не быть. Что касается назначения char, так тут всё просто, он нужен для представления символов(обычных). Если програмист задумал написать программу работающию с любыми символами, он вправе использовать любой другой тип. Если мне достаточно моих символов, мне и char'а достаточно, а вот если я предпологаю написать программу которую можно перевести на любой язык мира - возьму тип побольше, конкретно бит 16... Надо будет локализовать на всю вселенную - возьму double.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: С рссматривает символьные константы как тип int, а не char

Сообщение drBatty »

Red User писал(а):
27.10.2007 22:31
Почему? Вполне себе используется. Можно присвоить переменной типа char символьную константу. Просто при этом, по-видимому, происходит приведение типа.

неправильно. Нет приведения типа во время выполнения, символ преобразуется во время компиляции, причём в данном случае никакого преобразования нет, всё идёт точно так-же если заменить Z на 90(для x86). Попробуй поменять Z на Ж.
программа соберётся, даже будет "работать", хотя... Кстати sizeof('Z') у меня 1...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Red User писал(а):
27.10.2007 22:31

Да, код сработал. Действительно, под переменную 'Z' вы делено 4 байта... А если бы мы её задали, как int, тоже было бы выделено 4...
А где же экономия-то места, про которую говорил дядя Теодор? (cмотри там сообщение номер 2)
Если переменным одного типа можно присваивать значения другого типа,
Ну да, под сhar отведено 1 байт. Но ведь это ничего не значит- как только объявляю данные соответствующего типа, так сразу и забывается, что под каждую из них выделено1 байт и сразу выделяется 4.
Так он для чего, сhar? Для понятности, что ли?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Uncle_Theodore »

'Z' -- это не переменная...
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Да, 'Z' это символ.
...И это всё?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Uncle_Theodore »

promov писал(а):
28.10.2007 21:01
Да, 'Z' это символ.
...И это всё?

Нет, это и не символ тоже. Это символьная константа.
И таки да, это все. А чего Вы еще ждете?

Вы как маленький мальчик, спрашивающий "А почему Солнышко светит?" и ожидающий правильного на этот вопрос ответа. Потому что в нем происходит термоядерная реакция синтеза гелия. А 'Z' -- это не переменная. Потому sizeof и показывает такой ее размер. Но она прекрасно влазит в однобайтовый char.

Может, все-таки, сначала аз и буки, а потом -- другие науки?
Напишите-ка вот программу нахождения корней квадратного уравнения, не лезте Вы в дебри. Кроме очередного лилового тумана ничего Вы там не найдете... Разберитесь сначала с простым.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Так под 'Z'- то выделяется 4 байта? 4 это же не один, который хорошо было бы, если был бы выделен! Так где же экономия памяти-то?
Зачем квадратные уравнения? Я ничего не понял. Есть и квадратные и всякие, только я за них не спрашиваю потому, что мне всё понятно в них- ну, пока понятно. А также понятно за структуры, массивы данных, функции, рекурсию да много за чего ещё. А с этим char прямо нашла коса на камень...
А, да как Вы понять не можете: то, что у К&R на 30-ой странице, то у Cтефана Кочана на странице 349-ой. Что считать простым? Что сложным? C чего начать? Чем закончить? Вы знаете, я не знаю. Вы д'Артаньян, я известно кто... Ну и хватит на этом.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Uncle_Theodore »

Ну хорошо, раз Вам все понятно.
Тогда поймите, что 'Z' -- это не переменная. sizeof() возвращает размер типа данных, когда аргумент -- это имя типа или переменная типа. 'Z' -- это не переменная.
Вот посмотрите сюда

Код: Выделить всё

#include<stdio.h>

int main()
{
  char pp;
  const char z = 'Z';

  printf("Size of 'Z' is %d\n", sizeof('Z'));
  printf("Size of pp is %d\n", sizeof(pp));
  printf("Size of const char is %d\n", sizeof(const char));
  printf("Size of z is %d\n", sizeof(z));

  return 0;
}
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Я понял так, что если в программу добавить строку scanf ("%c", pp) и нажать на 'z', то переменная pp будет инициализирована значением 'z' и, что самое главное, будет занимать в памяти 1 байт. А дальше мне непонятно. Я так понял, что под cимвольную константу, имя которой z, выделено 1 байт (строки 3 и 4). И в то же самое время под неё выделено 4 байта (строка 1). В то же самое время.

Не понимаю.Правда. Она и 1 байт занимает, и 4. Не знаю я...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Uncle_Theodore »

Функцию sizeof() можно применять только к имени типа или к имени переменной. Поскольку выражение 'Z' ни тем, ни другим не является, результат -- температура воды в Бискайском заливе.
Спасибо сказали:
Аватара пользователя
phasma
Сообщения: 405

Re: С рссматривает символьные константы как тип int, а не char

Сообщение phasma »

Uncle_Theodore, хм, не ... для начала извлечение корня будет сложновато ... ибо с комплексными числами оно наверно и не сталкивалось ))) да и на Си честно сказать сам не работал с ними ...

promov, бросай курить.
NB: Dell XPS 1330 T5250|DDR2 4GB|NV 8400|250 GB
Old NB: Asus A6km AMD Turion MT-32|DDR 2 GB|NV GFGO 7300|60 Gb
OS: Ubuntu 9.10, FreeBSD 8.0
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Ну что ж, я принял на веру слова одного участника форума и я за это поплатился. То, что я узнал от Вас касаемо sizeof () очень ценно. И всё же.. Уже гадать начинаю...

Код: Выделить всё

char a= 'Z';


Под переменную a выделен 1 байт. Под 'Z', поскольку она символьная константа- 4. Всего 5. (Как 4 байта вмещаются в 1- это уж я соображу- и там и там важны последние 8 битов). Угадал?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Uncle_Theodore »

Да ничего под 'Z'не выделено!
Сейчас укушу... :crazy:

Когда Вы определяете переменную (даже если она константа, вот как const char), Вы даете ей имя.
Этому имени выделяется место в памяти, по этому имени компьютер обращается к месту в памяти, где находятся данные, содержимое этой несчастной переменой. И функцией sizeof() можно узнать размер этой выделенной области памяти. По имени переменной.
А выражение 'Z' -- это не имя переменной. Это сами данные. Не надо на них память выделять. И смысла в функции sizeof() на этом объекте нету!

Тут читайте http://www.informit.com/articles/article.a...173438&rl=1
И изучайте Ассемблер, если Вас такие вещи интересуют.
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: С рссматривает символьные константы как тип int, а не char

Сообщение promov »

Вот это всё мне понятно и было понятно, пока я не прочёл

"Несколько странным является тот факт, что C рассматривает символьные константы как тип int, а не char. Например, в системе с 32-разрядным типром int и с 8-разрядным типом char, код

сhar grade= 'B';

представляет 'B' как числовое значение 66, хранящееся в 32-разрядной ячейке памяти, но при этом переменная grade с трудом умещает значение 66 в 8-разрядную ячейку". Ну и дальше по тексту.
Cтивен Прата, "Язык программирования С, лекции и упражнения", Москва- Санкт-Петербург- Киев, 2006 г.
Видите, 32 бита это ведь не сhar, а int или long. Вот из-за чего разговор-то зашёл: зачем char (8 бит), когда всё равно меньше, чем 32 битами не обходятся!

В общем, он ошибся.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: С рссматривает символьные константы как тип int, а не char

Сообщение Red User »

Uncle_Theodore писал(а):
28.10.2007 22:26
Функцию sizeof() можно применять только к имени типа или к имени переменной. Поскольку выражение 'Z' ни тем, ни другим не является, результат -- температура воды в Бискайском заливе.


Насколько мне известно, к имени типа и к выражению. При этом sizeof(выражение) возвращает размер типа результата.
Например:

Код: Выделить всё

$ cat testing2.c
#include <stdio.h>

int main()
{
    int k = 3;

    printf("%d\n", sizeof(k));
    printf("%d\n", sizeof(double));
    printf("%d\n", sizeof(k + 0.17));

    return 0;
}

$ gcc testing2.c
$ ./a.out
4
8
8


Кстати, мой предыдущий пример, будучи скомпилированным g++, пишет, что размер символьной константы 1. Возможно, тут есть некоторое различие между C и C++.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали: