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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2019, 11:33   #1
Elvis777
 
Регистрация: 02.10.2019
Сообщений: 8
По умолчанию unsigned char ch

Продолжаю свое обучение ( по книжке Г. Шилдта, базовый курс с++, если это важно)
после набора программы возник вопрос:
#include<iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
unsigned char ch;
ch = 32;
while (ch)
{
cout << ch;
ch++;
}
return 0;
}
В книге дано пояснение:Рассмотрим while-выражение из предыдущей программы. Возможно, вас удивило, что
оно состоит всего лишь из одной переменной ch. Но "ларчик" здесь открывается просто.
Поскольку переменная ch имеет здесь тип unsigned char, она может содержать значения от 0
до 255. Если ее значение равно 255, то после инкрементирования оно "сбрасывается" в нуль.
Следовательно, факт равенства значения переменной ch нулю служит удобным способом
завершить while-цикл.

1. Хочу уточнить. Модификатор unsigned позволяет тип данных чар использовать как ing? Ибо ему присвоено значение числовое 32? я так понимаю когда в таблице(для 16 битки) unsigned char может принимать значение от 0 до 255?
2. Немного непонятна "алгоритмика"(поправьте если неправ): изначально ch=32. в скобках он сначала выводится через cout он вырастает на +1 и так до 255. потом все заканчивается. что произойдет когда значение 255? Он поймет что достиг предела? и цикл закончит. Почему цикл после достижения 255 и инкременирования достижения 0 закончит программу. Ведь в условии ch=32 и после значения 0 будет 1 и так далее. почему цикл просто не продолжается. Ладно если было бы в условии ch<32. А так пока затрудняюсь...
3. как происходит "преобразование" из числового значения ch в символ?

PS. Форумчане, заранее благодарен за помощь и понимание. Без Вас не справлюсь)
Elvis777 вне форума Ответить с цитированием
Старый 07.10.2019, 11:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Модификатор unsigned позволяет тип данных чар использовать как ing?
Как что?

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Ибо ему присвоено значение числовое 32?
И что присвоение 32 должно сделать с переменной по вашему? Думаете это как в телефоне оператор соединит?

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
я так понимаю когда в таблице(для 16 битки) unsigned char может принимать значение от 0 до 255?
Какая таблица? Причем тут 16 бит? Как они связаны с значением чара?
unsigned char - это в большинстве случаев 1 байт, т.е. 00000000b - 11111111b. Можете сами перевести значения и проверить.

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
что произойдет когда значение 255?
Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Если ее значение равно 255, то после инкрементирования оно "сбрасывается" в нуль.
Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Он поймет что достиг предела?
Кто он? Это просто одна ячейка памяти. Там нет ИИ, там не процессор...

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Почему цикл после достижения 255 и инкременирования достижения 0 закончит программу.
Потому что 0 в while интерпретируется как ложь.

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Ведь в условии ch=32
Причем тут это?

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
почему цикл просто не продолжается.
Считайте, что там написано ch != 0

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Ладно если было бы в условии ch<32.
И цикл не выполнился бы не разу...

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
3. как происходит "преобразование" из числового значения ch в символ?
Есть специальные таблицы, например, 1251, 866, utf8 (65001) ... В них символы пронумерованы.
p51x вне форума Ответить с цитированием
Старый 07.10.2019, 12:12   #3
Elvis777
 
Регистрация: 02.10.2019
Сообщений: 8
По умолчанию

Я хотел написать как int.

ну тогда ch<=32. Хотя признаю вашу правоту(0 для while как ложь)

те unsighed char 35=[определенный символ]?
Elvis777 вне форума Ответить с цитированием
Старый 07.10.2019, 12:14   #4
Elvis777
 
Регистрация: 02.10.2019
Сообщений: 8
По умолчанию

Я имел ввиду эту таблицу.
Изображения
Тип файла: jpg Безымянный.jpg (114.8 Кб, 62 просмотров)
Elvis777 вне форума Ответить с цитированием
Старый 07.10.2019, 12:15   #5
Elvis777
 
Регистрация: 02.10.2019
Сообщений: 8
По умолчанию

p51x, Спасибо большое) Вы реально помогли)
Elvis777 вне форума Ответить с цитированием
Старый 07.10.2019, 12:18   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Я хотел написать как int.
Тогда нет. Даже просто char можно "использовать как int". Естественно, с оговорками на размер и т.д.

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
ну тогда ch<=32. Хотя признаю вашу правоту(0 для while как ложь)
И цикл выполнится 1 раз.

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
те unsighed char 35=[определенный символ]?
Зависит от cp.

Цитата:
Сообщение от Elvis777 Посмотреть сообщение
Я имел ввиду эту таблицу.
Ну так прочитайте ее - в ней написано, что unsigned char занимает 8 бит.
p51x вне форума Ответить с цитированием
Старый 07.10.2019, 19:25   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

p51x
Цитата:
Потому что 0 в while интерпретируется как ложь.
Немного поправлю.
Значение переменной равное 0 в некоторых языках и, в частности Си, интерпретируется как FALSE.
И не важно в каком месте логического выражения используется переменная.
Это может быть цикл while, do, условие в операторе if или просто логическая функция.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 07.10.2019, 20:24   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Значение переменной равное 0 в некоторых языках и, в частности Си, интерпретируется как FALSE.
while(0) отработает? переменной то нет. И да, тема про С++ и конкретно while.

Цитата:
Сообщение от ViktorR Посмотреть сообщение
И не важно в каком месте логического выражения используется переменная.
Код:
a = 0;
if(a==false){}
Сработает?

А так, да: https://en.cppreference.com/w/cpp/la...an_conversions
Цитата:
A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.

The value zero (for integral, floating-point, and unscoped enumeration) and the null pointer and the null pointer-to-member values become false. All other values become true.
p51x вне форума Ответить с цитированием
Старый 07.10.2019, 21:11   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,378
По умолчанию

p51x
Цитата:
while(0) отработает?
Отработает. Переменной нет, но есть значение. У меня компилируется нормально.
Код:
while(0){
   printf("It's True"); // The operator does not work
}
do{
   printf("It's True"); // The operator is working
} while(0);
p51x
Код:
a = 0;
if(a==false){}
Сработает?

У меня работает:
Код:
int a;
a = 0;
if (a == false){
   printf("It's True");
}
А почему это не должно было сработать?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 08.10.2019, 10:29   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,716
По умолчанию

Код:
while(0){
   printf("It's True"); // The operator does not work
}
do{
   printf("It's True"); // The operator is working
} while(0);
Я думаю, что компилятор, если включена оптимизация, в первом случае вообще выкинет код - зачем выполнять то, что никогда не выполняется. Во втором - оставит printf, а while выкинет. Для уверенности нужно смотреть ассемблерный получившийся код.
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
sprintf в unsigned char. Есть ли разница? Салага Общие вопросы C/C++ 6 04.03.2018 05:02
конвертирование из unsigned char в char Sparky Помощь студентам 8 22.05.2012 16:46
'unsigned char [512]' в 'const char *' frommars Visual C++ 8 02.07.2011 13:37
unsigned char в array<Byte> Artemprodigy Visual C++ 0 23.03.2011 11:19
перевод в string из unsigned char Dimarik Общие вопросы C/C++ 5 22.03.2011 22:46