【问题标题】:why the character value stores in integer? [duplicate]为什么字符值以整数形式存储? [复制]
【发布时间】:2018-04-06 18:06:59
【问题描述】:

现在我正在写代码....

#include <stdio.h>
int main()

    {
        int c;
        printf("I'm waiting for a character: ");
        c = getchar();
        printf("I waited d for the '%c' character\n", c);
        return 0;
    }

如您所见,我已将 c 声明为整数,因此该值应在 0-9 之间,但接下来的第 3 行我只使用了 char 类型值的 printf() 转换字符。不知何故,它奏效了!!!那么让它发挥作用的原因是什么?

【问题讨论】:

  • 为了让它更有趣,请尝试将 printf 行更改为 printf("I waited for the %d character\n", c);
  • “int”只是一个整数,可能介于 -2147483648 和 +2147483647 之间,具体取决于您的平台。 getchar() 返回一个整数。 %c 导致 printf() 打印具有该值的字符。毕竟,字符和其他事物一样只是数字。
  • "该值应该在 0-9"。该值在'0''9' 中。请注意'0' 的类型为int。在典型(但并非总是)使用的 ASCII 系统中,字符 '0' 的值是 48,而不是 0

标签: c


【解决方案1】:

答案分为两部分。

你输入了

c = getchar();

但是getchar 清楚地返回字符,那么这如何工作呢?嗯,实际上,它工作得很好,部分原因是来自getchar 的返回值实际上是一个int(因此它也可以返回非charEOF)。所以这里完全没有问题。

然后你怎么能通过int%c 打印?通常,当您调用printf 时,您传递的参数的类型必须正确匹配格式说明符所期望的类型。 (例如,传递int 并尝试使用%f 打印它是一个真正的错误。)但是C 并不总是将类型传递给您编写的函数,有时它们会被转换(“提升” ) 转换为更大的通用类型。

这些转换适用的一种情况(在现代 C 中,几乎是唯一一次)是当您调用一个带有可变数量参数的函数时,例如 printf。在这种情况下,当您传递charshort int 类型的参数时,它会自动上转换为int。所以用%c 打印一个int 值就可以了。 (另一个重要的提升是,当你传递一个float 时,它会自动转换为double。所以事实证明你可以使用%f 打印floatdouble。)

事实上,在 C 语言中,字符确实是小整数,所以这并不奇怪。看到这一点的一种方法是稍微改变你的 printf 调用:

printf("I waited for the %d character\n", c);

现在如果你输入A,它会告诉你它得到了 65,因为在 ASCII 中,大写 A 的代码是 65。

【讨论】:

  • 不是我,但也许像printf 这样的可变参数函数的上下文中的“类型提升”可能更清楚。
  • @WeatherVane 谢谢,但我不担心随机投票。 (我怀疑有人认为,因为这个问题是如此基本且如此频繁,所以根本不应该回答它。)
【解决方案2】:

在 ascii 表中,任何字符值都有一个等价的整数。因此,如果您将一个字符值放入一个整数变量中,它将为该字符值分配等效的整数。

【讨论】:

  • C 不保证特定的字符编码。
  • 只有'0''9'之间的字符是连续的。
猜你喜欢
  • 2021-11-05
  • 2018-08-18
  • 2023-01-30
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2016-03-14
  • 2021-12-02
相关资源
最近更新 更多