我用c ++编写了一个用于切换案例的程序来理解:
int main()
{
int x = 65;
switch(x)
{
case 'A':printf( "One" );
break;
case 'B': printf( "Zero" );
break;
case 'C': printf( "Hello World" );
break;
default: printf("Invalid");
}
}
我的困惑是我声明了我的int x = 65
,此代码的输出为
One
怎么可能?为什么它与65
的ASCII值相关?
答案 0 :(得分:8)
'A'
是一个字符文字。它看起来像A
但实际上它根据字符集映射到某个整数值。在ASCII中,值为65
。那么会发生什么呢'A'
被提升为int
,其值由字符集(在这种情况下为65
)确定,然后将其与{{1}的值进行比较}。由于它们具有相同的值x
,因此打印出来。
这是实现定义的行为。 C ++没有强制要求字符集应该是什么,所以这个代码可以打印出任何其他输出。它只取决于字符集映射One
的值。这就是为什么要做像
'A'
很糟糕,因为它依赖magic numbers作为
char ch;
std::cin >> ch;
if (ch == 65)
...
将始终有效,因为它会依赖于特定的字符集。
答案 1 :(得分:5)
'A'
65。因为您的系统使用ASCII编码来表示字符文字,而字符文字是数字。您在代码中编写了'A'
,但实际上(假设为ASCII)表示(char)65
。
显然,65岁是65岁。
正在执行值比较,而不要求类型相同。
答案 2 :(得分:1)
是的,它与A的ASCII值为65的事实有关。
在switch语句中使用x
,这是一个整数,但所有情况下只提供字符(类型char
)。因此,在决定x
是否等于'A'
之前的某个地方,编译器必须进行从char
到int
的隐式转换,并将'A'
转换为{{1}给出65 - 假设您的编译器实现使用ASCII而不是其他字符集。
答案 3 :(得分:1)
Async
类型的对象(包括字符文字)属于整数类型,在内部它们存储为表示字符的整数值(代码)。
根据C ++标准(3.9.1基本类型)
1声明为字符(char)的对象应足够大以便存储 实现的基本字符集的任何成员。 如果是 这个集合中的字符存储在一个字符对象中,即积分 该字符对象的值等于单个值的值 该角色的字符文字形式。
和(4.5整体促销)
1除bool,char16_t,char32_t或之外的整数类型的prvalue wchar_t,其整数转换等级(4.13)小于等级 如果int可以表示all,则int可以转换为int类型的prvalue 源类型的值;否则,源prvalue可以 转换为unsigned int类型的prvalue。
所以当switch语句中的表达式
时char
的计算结果是将其值与转换为用作switch语句标签的每个字符文字的int类型的值进行比较。
因此,如果系统中的字符在内部由ASCII代码表示,那么例如十六进制值为65或十六进制为0x41表示字符文字' A'。
因此比较
switch(x)
等同于比较
x == 'A'
答案 4 :(得分:0)
您遇到的是Implicit Conversion的结果。
更具体地说;
<强> ... 强>
整体推广
小整数类型(例如char)的Prvalues可以转换为更大整数类型(例如int)的prvalues。特别是,算术运算符不接受小于int的类型作为参数,并且在左值到右值转换后自动应用整数促销(如果适用)。此转换始终保留该值。
以下隐式转化归类为整体促销:
- signed char或signed short可以转换为int;
...
这意味着当签名的char(例如&#39; char&#39;)与整数进行比较时,其类型会被提升为整数。
在您的系统上&#39; A&#39;定义为值0x41或十进制65。
你的switch语句包含一个整数,也就是65,并将它与&#39; A&#39;进行比较。
&#39; A&#39;被提升为一个整数并给出值65。
它正在有效地执行以下操作:
int a = 65;
char b = 'A';
if(a == static_cast<int>(b)){
...
}
注意给char的值是特定于实现的,所以在另一台机器上可能不是这样!
答案 5 :(得分:0)
当你在单撇号之间写任何字母时,你将它们称为char。这意味着它们可以被称为数值。在您的情况下,&#39; A&#39; 是指ascii值为65,而&#39; B&#39; 是指66和 &#39; C&#39; 是指67.编译器然后隐式地将int值转换为需要的char值,就像你的情况一样。请参阅以下示例:
int i = 99; // This ca be any number ranging from and including 65-90 and 97-122 (only for uppercase/lowercase letters)
char s = i; // Variable s is assigned a character at the ascii value stored in variable i
cout << s << endl; // Outputting s gives us the letter/character, outputting i gives the decimal value as an int.
注意:如果您编写&#34; A&#34;,那么这是一个字符串,而不是char值。您的编译器无法进行从int到string的转换。例如,这段代码将产生编译错误:
int i = 99; // This ca be any number ranging from and including 65-90 and 97-122 (only for uppercase/lowercase letters)
string s = i; // Here we are trying to store an int value in a string. This will fail
cout << s << endl; // Won't work
你需要看到的是我们可以对int值执行数学运算,这是我们无法对字符串执行的。例如,我们不能执行以下操作:
string total = "String a" * "String B";
但我们可以做到以下几点:
int total = 5 * 6;
另一方面,您可以对char值执行某些数学运算,就像int值一样,我们也可以根据ascii表使用int值来引用某个char;因此,这两种数据类型是兼容的。例如,这有效:
char s = 'A' + 2; // This results in the character C;
希望这能回答你的问题。
答案 6 :(得分:0)
如果你转到http://www.asciitable.com/,你会发现大写字母'A'的ASCII值为65.当你使用switch(x)并询问值'A'时,这是一个字符,然后通过ASCII十进制值将字符转换(类型转换)为整数;