Разница между нулевым завершающим символом char (\ 0) и `^ @`

Мои коды выглядят так:

#include  using std::cout; using std::endl; int main(int argc, char *argv[]) { cout << (int)('\0') << endl; cout << (char)(0) << endl; return 0; } 

Я ожидал увидеть в терминале вот так:

 $ test-program 0 $ 

Однако то, что я увидел, выглядит так:

 $ test-program 0 ^@ $ 

Что меня пугает, так это то, что я думаю, что '\0' можно преобразовать в 0 . И 0 также можно записать в \0 . Я ожидал увидеть нулевой символ, за которым следует endl , но результат был чем-то странным, как ^@ .

У кого-нибудь есть идеи об этом?

^@ – это как ваш эмулятор терминала показывает '\0' .

^@ – общее представление нулевого символа. Аналогично, ^A используется для представления символа с порядковым значением 1, ^G для символа с порядковым значением 7 (звонок) и ^M для символа с порядковым значением 13 (Возврат каретки).

 cout << (char)0 

Просто печатает представление символа, а не целое представление

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

В системах ./myProgram | hexdump -C используйте ./myProgram | hexdump -C ./myProgram | hexdump -C чтобы увидеть шестнадцатеричный вывод. Таким образом, вы убедитесь, что ваша программа делает то, что вы ожидаете от нее, так что это терминал, который ведет себя не так, как ожидалось:

 00000000 30 0a 00 0a |0...| 00000004 

Если вы видите тот же результат, что и я, вы на самом деле печатаете нуль '0' , новую строку '\n' , null '\0' , новую строку '\n' . Поэтому в этом случае ваша программа ведет себя так, как вы ожидали.

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

Если вы отбрасываете 0 в char , он не генерирует '0' , а '\0' – помните, что кастинг из интегрального типа в char создает char с этим кодом ASCII. Таким образом, в основном, вторая строка выводит нулевой символ (ASCII 0).

Если вы хотите вывести символ '0' , вам нужно было бы сделать что-то вроде (char) 48 , потому что 48 является значением ASCII для символа 0.