2016-03-30 60 views
2

我對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; 

而且我得到空字符(或新行)作爲輸出。

任何幫助表示讚賞。

+1

試着逐個輸出'2'和'0',然後看看這個[table](http://www.asciitable.com/)看看有什麼值2。和char。 – Incomputable

+0

@ kobe24因爲''2' - '0'== 2'(而'2'不是_printable_字符)。 –

+0

@DimChtz這只是因爲'x - = char(0);'和'x - = 0;'是一樣的,所以'x'沒有改變。 – molbdnilo

回答

4

根據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

    +0

    瞭解它,現在我明白了爲什麼我沒有得到任何輸出,如果我初始化x超過單個數字(如'20')並試圖打印差異 – kobe24

    +0

    @ kobe24多字節字符文字具有實現定義的值和類型int。 –

    1

    您正在從其減去48(ASCII字符 '0')到字符50(ASCII '2')

    50 - 48 = 2 
    if (x) ' true 
    
    1

    在C++中,字符都是由ASCII碼錶示的(見http://www.asciitable.com/) 我想這樣做:

    '2' - '0'

    是喜歡做

    50 - 48 = 2

    根據ASCII表,ASCII碼代表啓動文本,這是不通過COUT顯示的。

    希望它有幫助。

    +0

    該標準不需要ASCII。 – molbdnilo

    +0

    感謝您的洞察力,我將x初始化爲100,沒有撇號,並將它給出的值打印爲'd' – kobe24

    2

    在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編碼,這允許你打印一個數字。

    1

    那麼你的代碼做的是以下幾點:

    X =「2」,表示50作爲ASCII表中的十進制值。

    那麼你的基本上是說:

    X = X - '0',在那裏零在ASCII表被表示爲十進制48,這相當於爲x = 50 - 48 = 2

    請注意2!='2'。如果您在ASCII表格中查找2(十進制),將給您一個STX(文本開始)。這就是你的代碼在做什麼。所以請記住,減法是在char的十進制值上進行的。