我对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;
我得到空字符(或新行)作为输出。
感谢任何帮助。
答案 0 :(得分: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;
然后运营商&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的十进制值上进行的。