Member 12702056 Ответов: 3

В чем разница между нулевым символом и нормальным нулем?


В чем разница между char zero и normal zero в c++? особенно я имею в виду в c++
например,
char x=0;
int x=0;
и char x= '0'
или просто как "0"
в чем разница между ними всеми?в чем их точный смысл?
Пожалуйста, помогите мне :)

Что я уже пробовал:

Я знаю, что int x=0 - это число ноль.

3 Ответов

Рейтинг:
4

Patrice T

Символы используются для хранения букв и других знаков с использованием кодировки ASCII или UniCode, заменяющей ASCII в последних версиях компиляторов.
ASCII-Википедия, свободная энциклопедия[^]

char x='0';
// and
char x=48;
// are the same thing.

[Обновление]
Кодировка ASCII / UniCode используется для ввода / вывода
Когда вы набираете 0 на клавиатуре, вы получаете код 48, но проще использовать " 0 " в коде, а не 48.
Кодировка ASCII/UniCode используется на C, C++, C#, VB, Java, JS, любом языке.

[Улучшение]
В компьютере экран (консольный режим), клавиатура и файлы используют ASCII/UniCode для кодирования всех символов.
Это означает, что когда вы наберете 0 в блокноте и сохраните файл, он будет содержать 1 значение, равное 48. Если вы наберете "меня зовут Бонд", файл будет содержать 77,121,32,110,97,109,101,32,105,115,32,66,111,110,100.
Когда вы видите 0, 1, 2 ... в коде значения означают вычисление противника.
Когда вы видите '0', '1', '2' ... в коде это означает, что он связан с вводом/выводом, либо для проверки ввода с клавиатуры, либо для отображения этого символа на экране ...
Это легче читать '0', '1', '2' вместо 48, 49, 50 ...
Легче читать "меня зовут Бонд", чем 77,121,32,110,97,109,101,32,105,115,32,66,111,110,100.


Member 12702056

я видел этот вид записи "0" в основном в цикле while, например:
в то время как (x!= '0')

из вашего объяснения я понял, что "0" - это символ, но то же самое происходит и с другим символом char x=48
- да?
я написал это в программе и проверил, да, это тот же char x=48/но вы знаете это из ASCII, да?

Member 12702056

но в c++они такие же, как вы объяснили?

BillWoodruff

Мой голос за № 1. Стандартная кодировка в .NET-это не ASCII, а Unicode. Код, который вы опубликовали, никогда не будет компилироваться: причина очевидна.

Patrice T

Я был бы счастлив получить 3 голоса :)
Вопрос был в следующем "особенно я имею в виду в c++", не .Нет.
ОП сбит с толку разницей в использовании 0 и "0" в коде. Использование ASCII или UniCode в объяснении не меняет объяснения.
Размер char будет зависеть от возраста компилятора, версия которого не была задана.

Этот фрагмент кода не предназначен для компиляции в соответствии с комментариями, эти 2 строки одинаковы.

Member 12702056

ppolymorphe, вы имеете в виду char x='0', равный int x=48 ?! Разве это так? Могу ли я получить его правильно?
//__________
И о char x=0;
Правильно ли это написано?или int 0 не может быть равен char ?
Мой голос:5 :)

Patrice T

Нет и да, char и int различны, но для того, чтобы сравнить char и целое число, C изменяет размер char на целое число, чтобы иметь возможность сравнить 2.

У меня такое чувство, что вы пытаетесь пропустить шаги в изучении языка Си, чтобы стать быстрее, не делайте этого или постоянно сталкиваетесь с подобными проблемами
Рекомендую прочитать эту книгу
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]

Member 12702056

Спасибо :)
Я видел, что пишу в одном примере программы с циклом while, но точно понять не мог.
Теперь это более ясно в моем сознании .

Рейтинг:
2

BillWoodruff

Тип 'Char is" является экземпляром системы.Структурная схема, что .Framework использует для представления символов Unicode. Значение объекта Char - это 16-битное числовое (порядковое) значение.

Символы юникода используются для представления большинства письменных языков по всему миру." [^].

Тип ' Int-это 32-битное целое число со знаком; .NET обеспечивает неявное преобразование в другие целочисленные типы, когда вы объявляете и инициализируете 'Int без суффикса в конце:: в зависимости от значения, которое вы назначаете, .NET может сделать переменную другим целочисленным типом, например 'uInt, 'ulong. См.: >[^].

Для преобразования из типа int к char или 'типа char в int требует литье:

int i = 48;
char c = '0';

char c1 = (char) i;
int i1 = (int)c1;

bool b1 = (int)c == (char)i;   // true
bool b2 = i1 == c1;  // true
Поскольку символ Юникода может быть представлен как 16-битный интергер, это также будет работать:
Int16 i = 48;
char c = '0';

char c1 = (char) i;
Int16 i1 = (Int16)c1;

bool b1 = i1 == c1;
bool b2 = (int)c == (char)i;


Patrice T

Я думаю, вы упустили суть вопроса.
ОП сказал:
я видел этот вид записи "0" в основном в цикле while, например:
в то время как (x!= '0')

Member 12702056

Билл Вудрафф, спасибо за Ваше объяснение :),но на самом деле я не могу понять, что именно вы имели в виду.

Рейтинг:
1

asimonassi

Привет, я не в курсе последних версий c++ и того, как он сильно типизирован в наши дни:

Концепция

Концепция заключается в том, что представление памяти изменяется в зависимости от типа объявления.

Char обычно определяется как 8-битная ячейка памяти, int обычно определяется как 32-битная или 64-битная

char x = <whatever>; //you are reserving 1 byte
int x = <whatever>; //you are reserving (let's say) 4 bytes


Литерал " 0 "в C и C++ представляет собой символ "0", а не значение 0, например, код ascii для символа " 0 "равен 48 (десятичный), символ Nul вместо этого представлен литералом "\0 " или "\x0".

Как это работает

Чтобы понять, как это работает, представьте, как ваша переменная живет в компьютере: это часть оперативной памяти, предположим, что память, связанная с вашей переменной, находится по адресу 100.

Вот ваша оперативная память, прежде чем вы инициализируете свою переменную, ее содержимое не определено:
100: ?
101: ?
102: ?
103: ?


вот как различные версии, которые вы опубликовали, влияют на состояние вашей памяти:

char x=0; Мне это не очень нравится, но для компилятора все хорошо.

100: 0
101:  (not allocated to x, cause is char that only use 1 cell)
102:  (not allocated to x)
103:  (not allocated to x)


int x=0; (это хорошо, никакого преобразования не требуется)

100: 0
101: 0
102: 0
103: 0


символ x= '0'; (это хорошо, никакого преобразования не требуется)

100: 48d (48 is decimal ascii code for characted '0')


char x = '\0';
(то же самое, что и выше, но '\0' - это буквальный символ, представляющий ASCII NUL, именно так я предпочитаю инициализировать символ до 0)
100: 0


int x = '0'; Мне это не нравится, потому что правая часть-это литерал, я могу терпеть присвоение переменной char переменной int.

100: 48d (in this example the machine is little endian, LSB stored at lower address)
101: 0 
102: 0
103: 0