' A'的整数值

时间:2017-01-18 13:02:51

标签: c++

我用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值相关?

7 个答案:

答案 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'之前的某个地方,编译器必须进行从charint的隐式转换,并将'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十进制值将字符转换(类型转换)为整数;