С рссматривает символьные константы как тип int, а не char (Как вам это нравится?)
Модератор: Модераторы разделов
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
С рссматривает символьные константы как тип int, а не char
Вы-то, наверное в недоумении, а мне-то каково? Я неделю бьюсь над char и int, наконец, начинаю кое-что понимать (что разделение на эти типы в Pascale довольно условно, но ещё более условно оно в C, что, вообще-то ввод любого из символов есть по сути ускоренный ввод целого числа от 0 до 255, что можно было бы тип char и не придумывать, но тогда любой из символов занимал бы в памяти столько места, сколько занимает сейчас число типа int- 32 бита ну, или 16 на худой конец, а так придумали тип char, определили место под переменную этого типа- 8 бит- глядишь, память и сэкономили... И на тебе, сюрприз:
"Несколько странным являетя тот факт, что С рассматривает символьные константы как тип int, а не char."
Не знаю даже, как вопрос поставить... Так он после таких заявлений существует или нет, этот char, если он не нужен вообще, если все символьные костанты рассматриваются как int?
Да, чуть не забыл.. Стивен Прата, "Язык программирования С. Лекции и упражнения"
"Несколько странным являетя тот факт, что С рассматривает символьные константы как тип int, а не char."
Не знаю даже, как вопрос поставить... Так он после таких заявлений существует или нет, этот char, если он не нужен вообще, если все символьные костанты рассматриваются как int?
Да, чуть не забыл.. Стивен Прата, "Язык программирования С. Лекции и упражнения"
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: С рссматривает символьные константы как тип int, а не char
во первых char придумали для того, что бы отделить числа от символов, тип char это число со знаком в которое точно войдёт 1 символ, ещё известно, что он не больше int'а, вобщем то и всё. У нас char это число -128...127. А символьная константа действительно рассматривается как int например у нас '/0' абсолютно то же самое что и просто 0. Только не путай c "xxx" это совсем другая константа, её тип char *(скорее const char*).
Что вобщем то не делает незаконными такие вещи:
если тебе нравятся символы 0...255 используй тип unsigned char, незабывая о том, что все используют просто char, именно по этому 'Ж' < 'Q' и 'Ж' < '/0'
Что вобщем то не делает незаконными такие вещи:
Код: Выделить всё
int i = '@';
char c = -55;если тебе нравятся символы 0...255 используй тип unsigned char, незабывая о том, что все используют просто char, именно по этому 'Ж' < 'Q' и 'Ж' < '/0'
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: С рссматривает символьные константы как тип int, а не char
Что это значит?
Попробую сам ответить: это значит, что для представления символа в памяти машины выделено 4 или 2 байта. А тип char- тот однобайтовый, для хранения символьных костант не используется теперь. Так он для чего тогда?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Red User
- Сообщения: 229
- ОС: Debian
Re: С рссматривает символьные константы как тип int, а не 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'ом выходили на бой,
И искусно написанный вирус встречали как брата
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
-
s0urce
- Сообщения: 321
- ОС: Arch Linux + WinXP
Re: С рссматривает символьные константы как тип int, а не char
страшную тайну открою тебе, компьютер вообще не про какие символы понятия не имеет, у него всё есть число, поэтому твоё удивление несколько странно...А тип char- тот однобайтовый, для хранения символьных костант не используется теперь. Так он для чего тогда?
а для чего нужен char? а для удобства, человек же не компьютер и ему x=' ' гораздо понятнее, чем x=32. А приводится этот тип к int, потому что процессор быстрее всего обрабатывает операции именно с типом int, т.к. он соответствует размеру 1 регистра процессора...
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: С рссматривает символьные константы как тип int, а не char
Надо просто понять: константы отличаются от выражений. Те константы(цифры и буквы) что ты пишешь в программе обрабатоваются компилятором и записоваются в выражения. К примеру, если ты напишешь
Код: Выделить всё
int x = 7;
int y = x/2;Код: Выделить всё
int x;
int y = x >> 1;а может вообще сделать так:
Код: Выделить всё
int x = 7; int y = 3;-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: С рссматривает символьные константы как тип int, а не char
неправильно. Нет приведения типа во время выполнения, символ преобразуется во время компиляции, причём в данном случае никакого преобразования нет, всё идёт точно так-же если заменить Z на 90(для x86). Попробуй поменять Z на Ж.
программа соберётся, даже будет "работать", хотя... Кстати sizeof('Z') у меня 1...
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: С рссматривает символьные константы как тип int, а не char
Да, код сработал. Действительно, под переменную 'Z' вы делено 4 байта... А если бы мы её задали, как int, тоже было бы выделено 4...
А где же экономия-то места, про которую говорил дядя Теодор? (cмотри там сообщение номер 2)
Если переменным одного типа можно присваивать значения другого типа,
Ну да, под сhar отведено 1 байт. Но ведь это ничего не значит- как только объявляю данные соответствующего типа, так сразу и забывается, что под каждую из них выделено1 байт и сразу выделяется 4.
Так он для чего, сhar? Для понятности, что ли?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: С рссматривает символьные константы как тип int, а не char
'Z' -- это не переменная...
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: С рссматривает символьные константы как тип int, а не char
Да, 'Z' это символ.
...И это всё?
...И это всё?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: С рссматривает символьные константы как тип int, а не char
Нет, это и не символ тоже. Это символьная константа.
И таки да, это все. А чего Вы еще ждете?
Вы как маленький мальчик, спрашивающий "А почему Солнышко светит?" и ожидающий правильного на этот вопрос ответа. Потому что в нем происходит термоядерная реакция синтеза гелия. А 'Z' -- это не переменная. Потому sizeof и показывает такой ее размер. Но она прекрасно влазит в однобайтовый char.
Может, все-таки, сначала аз и буки, а потом -- другие науки?
Напишите-ка вот программу нахождения корней квадратного уравнения, не лезте Вы в дебри. Кроме очередного лилового тумана ничего Вы там не найдете... Разберитесь сначала с простым.
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: С рссматривает символьные константы как тип int, а не char
Так под 'Z'- то выделяется 4 байта? 4 это же не один, который хорошо было бы, если был бы выделен! Так где же экономия памяти-то?
Зачем квадратные уравнения? Я ничего не понял. Есть и квадратные и всякие, только я за них не спрашиваю потому, что мне всё понятно в них- ну, пока понятно. А также понятно за структуры, массивы данных, функции, рекурсию да много за чего ещё. А с этим char прямо нашла коса на камень...
А, да как Вы понять не можете: то, что у К&R на 30-ой странице, то у Cтефана Кочана на странице 349-ой. Что считать простым? Что сложным? C чего начать? Чем закончить? Вы знаете, я не знаю. Вы д'Артаньян, я известно кто... Ну и хватит на этом.
Зачем квадратные уравнения? Я ничего не понял. Есть и квадратные и всякие, только я за них не спрашиваю потому, что мне всё понятно в них- ну, пока понятно. А также понятно за структуры, массивы данных, функции, рекурсию да много за чего ещё. А с этим char прямо нашла коса на камень...
А, да как Вы понять не можете: то, что у К&R на 30-ой странице, то у Cтефана Кочана на странице 349-ой. Что считать простым? Что сложным? C чего начать? Чем закончить? Вы знаете, я не знаю. Вы д'Артаньян, я известно кто... Ну и хватит на этом.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: С рссматривает символьные константы как тип int, а не char
Ну хорошо, раз Вам все понятно.
Тогда поймите, что 'Z' -- это не переменная. sizeof() возвращает размер типа данных, когда аргумент -- это имя типа или переменная типа. 'Z' -- это не переменная.
Вот посмотрите сюда
Тогда поймите, что '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
Я понял так, что если в программу добавить строку scanf ("%c", pp) и нажать на 'z', то переменная pp будет инициализирована значением 'z' и, что самое главное, будет занимать в памяти 1 байт. А дальше мне непонятно. Я так понял, что под cимвольную константу, имя которой z, выделено 1 байт (строки 3 и 4). И в то же самое время под неё выделено 4 байта (строка 1). В то же самое время.
Не понимаю.Правда. Она и 1 байт занимает, и 4. Не знаю я...
Не понимаю.Правда. Она и 1 байт занимает, и 4. Не знаю я...
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: С рссматривает символьные константы как тип int, а не char
Функцию sizeof() можно применять только к имени типа или к имени переменной. Поскольку выражение 'Z' ни тем, ни другим не является, результат -- температура воды в Бискайском заливе.
-
phasma
- Сообщения: 405
Re: С рссматривает символьные константы как тип int, а не char
Uncle_Theodore, хм, не ... для начала извлечение корня будет сложновато ... ибо с комплексными числами оно наверно и не сталкивалось ))) да и на Си честно сказать сам не работал с ними ...
promov, бросай курить.
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
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
Ну что ж, я принял на веру слова одного участника форума и я за это поплатился. То, что я узнал от Вас касаемо sizeof () очень ценно. И всё же.. Уже гадать начинаю...
Под переменную a выделен 1 байт. Под 'Z', поскольку она символьная константа- 4. Всего 5. (Как 4 байта вмещаются в 1- это уж я соображу- и там и там важны последние 8 битов). Угадал?
Код: Выделить всё
char a= 'Z';Под переменную a выделен 1 байт. Под 'Z', поскольку она символьная константа- 4. Всего 5. (Как 4 байта вмещаются в 1- это уж я соображу- и там и там важны последние 8 битов). Угадал?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: С рссматривает символьные константы как тип int, а не char
Да ничего под 'Z'не выделено!
Сейчас укушу...
Когда Вы определяете переменную (даже если она константа, вот как const char), Вы даете ей имя.
Этому имени выделяется место в памяти, по этому имени компьютер обращается к месту в памяти, где находятся данные, содержимое этой несчастной переменой. И функцией sizeof() можно узнать размер этой выделенной области памяти. По имени переменной.
А выражение 'Z' -- это не имя переменной. Это сами данные. Не надо на них память выделять. И смысла в функции sizeof() на этом объекте нету!
Тут читайте http://www.informit.com/articles/article.a...173438&rl=1
И изучайте Ассемблер, если Вас такие вещи интересуют.
Сейчас укушу...
Когда Вы определяете переменную (даже если она константа, вот как const char), Вы даете ей имя.
Этому имени выделяется место в памяти, по этому имени компьютер обращается к месту в памяти, где находятся данные, содержимое этой несчастной переменой. И функцией sizeof() можно узнать размер этой выделенной области памяти. По имени переменной.
А выражение 'Z' -- это не имя переменной. Это сами данные. Не надо на них память выделять. И смысла в функции sizeof() на этом объекте нету!
Тут читайте http://www.informit.com/articles/article.a...173438&rl=1
И изучайте Ассемблер, если Вас такие вещи интересуют.
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: С рссматривает символьные константы как тип int, а не char
Вот это всё мне понятно и было понятно, пока я не прочёл
"Несколько странным является тот факт, что 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 битами не обходятся!
В общем, он ошибся.
"Несколько странным является тот факт, что 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
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'ом выходили на бой,
И искусно написанный вирус встречали как брата
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата