c ++中的字符减法

时间:2016-03-30 13:23:30

标签: c++ char operators

我对C ++很新,我在理解c ++中的字符减法方面遇到了一些麻烦。

我有这个代码

char x='2';
x-='0';
if(x) cout << "More than Zero" << endl;

这返回超过零作为输出,以便知道x的值我尝试了这段代码。

char x='2';
x-='0';
if(x) cout << x << endl;

我得到空字符(或新行)作为输出。

感谢任何帮助。

5 个答案:

答案 0 :(得分:4)

根据C ++标准(2.3字符集)

  
      
  1. ...在源和执行基本字符集中,值为   上面的十进制数字列表中的每个字符后面的0应为   一个大于前一个的值。
  2.   

因此,任何字符集中相邻数字的代码相差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;

然后运营商&lt;&lt;尝试将x输出为值2的可打印字符图像,因为x的类型为char

答案 1 :(得分:2)

在C / C ++中,字符存储为具有ASCII编码的8位整数。因此,当你执行x-='0';时,你将从'2'的ASCII值中减去'0'的ASCII值为48,即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编码,这将打印一个数字。

答案 2 :(得分:1)

你将48(ascii char'0')减去字符50(ascii'2')

50 - 48 = 2
if (x) ' true

答案 3 :(得分:1)

在C ++中,字符全部用ASCII代码表示(参见http://www.asciitable.com/) 我想这样做:

  

'2' - '0'

就像在做

  

50 - 48 = 2

根据ASCII表,ASCII码 2 代表文本开头,cout不会显示。

希望它有所帮助。

答案 4 :(得分:1)

所以你的代码正在做的是:

x =&#39; 2&#39;,在ASCII表中表示50作为十进制值。

那么你基本上是在说:

x = x - &#39; 0&#39;,其中ASCII表中的零表示为十进制48,相当于x = 50 - 48 = 2.

请注意2!=&#39; 2&#39; 。如果在ASCII表中查找2(十进制),它将为您提供STX(文本开头)。这就是您的代码正在做的事情。所以请记住,减法是在char的十进制值上进行的。