我對C++來說相當陌生,而且在理解C++中的字符減法時遇到了一些麻煩。C++中的char減法
我有這個代碼intially
char x='2';
x-='0';
if(x) cout << "More than Zero" << endl;
這回大於零的輸出,這樣就知道我想這碼x的值。
char x='2';
x-='0';
if(x) cout << x << endl;
而且我得到空字符(或新行)作爲輸出。
任何幫助表示讚賞。
我對C++來說相當陌生,而且在理解C++中的字符減法時遇到了一些麻煩。C++中的char減法
我有這個代碼intially
char x='2';
x-='0';
if(x) cout << "More than Zero" << endl;
這回大於零的輸出,這樣就知道我想這碼x的值。
char x='2';
x-='0';
if(x) cout << x << endl;
而且我得到空字符(或新行)作爲輸出。
任何幫助表示讚賞。
根據C++標準(2.3字符集)
- ...在源和執行基本字符集,的 每個字符0之後的值在上面的小數位數列表中應該是 一個大於前一個數值。
所以任何字符集相鄰數字的代碼按1
因此,在該代碼段不同
char x='2';
x-='0';
if(x) cout << x << endl;
碼之間'2'
和'0'
(差值之間的差代表這些字符;例如在ASCII中,這些代碼是0x32和0x30,而在EBCDIC中它們是0xF2和0xF0)等於2
。
您可以檢查此例如通過以下方式
if(x) cout << (int)x << endl;
或
if(x) cout << static_cast<int>(x) << endl;
如果你只寫
if(x) cout << x << endl;
那麼運營商< <試圖輸出x
作爲值爲01的可打印字符圖像,因爲x
的類型是char
。
瞭解它,現在我明白了爲什麼我沒有得到任何輸出,如果我初始化x超過單個數字(如'20')並試圖打印差異 – kobe24
@ kobe24多字節字符文字具有實現定義的值和類型int。 –
您正在從其減去48(ASCII字符 '0')到字符50(ASCII '2')
50 - 48 = 2
if (x) ' true
在C++中,字符都是由ASCII碼錶示的(見http://www.asciitable.com/) 我想這樣做:
'2' - '0'
是喜歡做
50 - 48 = 2
根據ASCII表,ASCII碼代表啓動文本,這是不通過COUT顯示的。
希望它有幫助。
在C/C++字符中存儲爲ASCII編碼的8位整數。所以當你做x-='0';
時,你正在從'2'的ASCII值減去'0'的ASCII值爲50,那麼x等於2,這是一個特殊的控制字符,表示STX(文本開始) ,這是不可打印的。
如果要對字符進行算術運算,最好在執行任何操作之前從每個字符中減去「0」並將「0」加到結果中。爲了避免像在8位值範圍內運行的問題,我建議將它們投入整數或長整型。
char x = '2';
int tempVal = x - '0';
/*
Some operations are performed here
*/
x = tempValue % 10 + '0';
// % 10 - in case it excedes the range reserved for numbers in ASCII
cout << x << endl;
這是更加安全的較大的值類型執行這些操作,並減去字符「0」,您可以執行獨立於ASCII編碼操作就像你隨隨便便做的整數。然後你加'0'返回到ASCII編碼,這允許你打印一個數字。
那麼你的代碼做的是以下幾點:
X =「2」,表示50作爲ASCII表中的十進制值。
那麼你的基本上是說:
X = X - '0',在那裏零在ASCII表被表示爲十進制48,這相當於爲x = 50 - 48 = 2
請注意2!='2'。如果您在ASCII表格中查找2(十進制),將給您一個STX(文本開始)。這就是你的代碼在做什麼。所以請記住,減法是在char的十進制值上進行的。
試着逐個輸出'2'和'0',然後看看這個[table](http://www.asciitable.com/)看看有什麼值2。和char。 – Incomputable
@ kobe24因爲''2' - '0'== 2'(而'2'不是_printable_字符)。 –
@DimChtz這只是因爲'x - = char(0);'和'x - = 0;'是一樣的,所以'x'沒有改變。 – molbdnilo