Назначение типа char для int для печати соответствующего символа ASCII - PullRequest
0 голосов
/ 30 октября 2019

Код запрашивает положительное целое число, тогда как первый вывод показывает соответствующий код ASCII, остальные сделаны для преобразования целого числа в десятичный, восьмеричный и шестнадцатеричный эквиваленты. Я понимаю логику кода, но не понимаю назначение, сделанное в строке 10 c=code, чем назначение, выполненное в строке 12 code=c. Что происходит на фоне, когда мы «меняем» две переменные.

#include <iostream>
#include <iomanip>
using namespace std;

int main(){
    unsigned char c = 0;
    unsigned int code = 0;
    cout << "\nPlease enter a decimal character code: ";
    cin >> code;
    c = code; 
    cout << "\nThe corresponding character: " << c << endl;
    code = c; 
    cout << "\nCharacter codes"
    << "\n decimal: " << setw(3) << dec << code
    << "\n octal: " << setw(3) << oct << code
    << "\n hexadecimal: " << setw(3) << hex << code
    << endl;
    return 0;
}

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Я могу ошибаться, так что, может быть, кто-то другой может взвесить, но я думаю, что знаю ответ.

Если вы назначаете символу число, то при печати этого char печатается соответствующий символ. ,Поскольку c имеет тип char, строка c = code преобразует целое число, введенное в символ. Вы можете проверить это самостоятельно, присвоив любую int переменной char и распечатав ее.

Второе назначение, code = c, кажется совершенно ненужным.

0 голосов
/ 30 октября 2019

Это не своп. c присваивается то же значение, что и code, а затем это значение присваивается обратно code. Исходное значение code потеряно.

Мы можем видеть это, потому что unsigned char c (обычно) намного меньше, чем unsigned int code, и некоторая информация может быть потеряна, если вставить значение в code в c.

Например, code = 257. После c = code; code по-прежнему 257 и c, при условии, что 8-битный char будет равен 1. После code = c; оба codeи c будет 1. 257. было потеряно.

Почему это делается? если дано char, operator<< будет распечатывать закодированный символ, полностью игнорируя запрос на печать как hex, dec или oct. Так что

<< "\n decimal: " << setw(3) << dec << c

потрачено впустую. Учитывая, что int << будет учитывать модификаторы, но если c и code имеют разные значения, вы сравниваете яблоки и Sasquatches.

...