可能我要问一个愚蠢的问题,但我想确认char是如何工作的?让我用例子来解释我想问的问题。假设我先声明一个char variable
,然后是input 6
或任意整数字符。
#include <iostream>
using namespace std;
int main(){
char a;
cin >> a;
cout << a*a; // I know here input's ASCII value will multiply
return 0;
}
同整数input 6
#include <iostream>
using namespace std;
int main(){
int a;
cin >> a;
cout << a*a; // Why compiler not take input's ASCII Value here?
return 0;
}
我想现在我的问题很清楚了。
char
是一种基本数据类型,大小为1字节(不一定是8位!!),能够表示至少所有字符的ASCII码范围。因此,例如,char x = 'a';
实际上存储'a'
的ASCII值,在本例中为97。然而,ostream
运算符是重载的,所以它们"知道"如何处理char
,而不是盲目地在cout << x;
这样的行中显示97
,它们显示字符的ASCII表示,即'a'
。
但是,无论何时执行a * a
,编译器都会执行所谓的整型提升,并隐式地将char
中的数据转换为int
。因此,对于编译器来说,表达式a * a
被翻译成(int)a * (int)a
,这是97 * 97
的结果,所以最终显示的是9409
。
注意,对于编译器char
和int
是两个不同的类型。它可以区分这两者。因此,operator<<
仅在输入类型为char
或可隐式转换为char
的类型时显示字符。
在char
的情况下,它不是二进制被相乘,它是你输入的任何ASCII值。如果是6
,则ASCII值为54
,因此输出2916
。当a
为int
时,直接存储6
,因此输出36
在int的情况下,它将读取您键入的数字作为数值而不是其ASCII值。因此,你只能对整数使用数字,然而char允许你使用任何字符(例如:A,B,C,D | 1,2,3,4 | !#%^),它使用它的ASCII值。例如,4的ASCII值为52,A、*的ASCII值分别为65、42。注意:大写字母和小写字母是不同的(例如S = 83,而反过来S = 115)。
希望这能帮到你。
这是因为隐式类型转换:
当某个类型的表达式存在时,执行隐式转换T1用于不接受该类型但接受某些类型的上下文中其他类型T2,特别是:
当表达式用作操作数时,操作符为预计T2
在你的例子中
char a;
cin >> a;
cout << a*a; /
Operator *需要一个整型,所以类型char
被隐式转换为int
,所以当char转换为int时,系统使用char对应的ASCII值。详见http://en.cppreference.com/w/cpp/language/implicit_cast