Cout без знака - PullRequest
       43

Cout без знака

1 голос
/ 06 февраля 2020

Я использую Visual Studio 2019 : почему эта команда ничего не делает?

std::cout << unsigned char(133);

Она буквально пропускается моим компилятором (я проверял ее, используя пошаговые инструкции). отладка): я ожидал отпечаток à. Каждый вывод перед следующей командой игнорируется, но не предыдущие. (std::cout << "12" << unsigned char(133) << "34"; печатает "12")

Я также пытался изменить это на:

std::cout << unsigned char(133) << std::flush;
std::cout << (unsigned char)(133);
std::cout << char(-123);

, но результат тот же.

Я помню что это работало раньше, и некоторые из моих программ, использующих эту команду, загадочным образом перестали работать ... В новом пустом проекте тот же результат!

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

На других онлайн-компиляторах он работает правильно, поэтому может быть ошибка Visual Studio 2019 ?

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

«Вменяемый» ответ: не полагайтесь на символы расширенного ASCII. Юникод достаточно широко распространен, чтобы сделать его предпочтительным подходом:

#include <iostream>
int main() {
    std::cout << u8"\u00e0\n";
}

Это явно напечатает запрошенный вами символ à; фактически, ваш браузер также это понимает, что вы можете легко проверить, вставив, например, в какой-нибудь поиск символов Юникода, который приведет к LATIN SMALL LETTER A WITH GRAVE, с кодом U+00E0, который вы можете заметить в приведенном выше коде.

В вашем примере нет разницы между использованием знака или знака без знака; значение 133 байта записывается в терминал, но способ его интерпретации может отличаться от машины к машине, в зависимости от того, как он настроен для его интерпретации. На самом деле, в консоли UTF-8 это просто неправильная последовательность Юникода (u"\0x85" не является допустимым символом) - если ваша ОС была переключена на UTF-8, возможно, поэтому вы не видите вывода.

0 голосов
/ 06 февраля 2020

Вы можете попробовать использовать static_cast

std::cout << static_cast<unsigned char>(133) << std::endl;

Или

std::cout << static_cast<char>(133) << std::endl;

Поскольку в моем случае все это работает, трудно точно определить проблему, здравый смысл указывал бы на некоторую проблему конфигурации.

...