【问题标题】:is using int variables as char variables OK?使用 int 变量作为 char 变量好吗?
【发布时间】:2015-09-22 12:46:51
【问题描述】:

所以我的问题是为什么有些人使用 int 变量作为 char 变量。 例子

int main()

{

 int i;

 scanf("%c",&i);

printf ("%c",i);

}

先谢谢了

【问题讨论】:

  • scanf("%c",&i); 是错误的。所以printf ("%c",i);无法获得便携结果。
  • 您是否尝试过您的代码?在线编译器说不行:ideone.com/clSfwc
  • @mch 如果没有设置-Werror 标志,则此代码编译时带有警告。
  • 总是启用编译器警告!
  • “但它对我有用”并不意味着它在所有情况下都可以,甚至在第二次调用时也可以。请考虑 undefined behaviour 的含义

标签: c char int


【解决方案1】:

C 的char 是整数类型。它的(数字)值最常用于表示字符,但这是另一回事。

您可以安全地使用int 类型的变量来保存char 类型范围内的值。您可以将 char 分配给 int 或将 char 传递给期望 int 的函数,既无需强制转换,也无需更改值。

在某些地方,有意使用int 代替char 来表示字符。典型案例可能是标准库的getc()、fgetc() 和getchar() 函数,除了所有可能的char 值之外,它们还需要int 的范围才能表示EOF。此外,由于历史原因,其他一些函数声明 int 参数以接受预期类型为 char 的数据; memset() 是其中比较知名的之一。

另一方面,指向int 和char 的指针不可互换。正如其他人指出的那样,您的 scanf() 调用因此会产生未定义的行为。

一般来说,您应该使用char 而不是int 来表示字符数据,除非有很好的、外部驱动的理由不这样做(例如需要处理getchar() 的返回值)。更一般地说,正确匹配数据类型,仔细考虑允许在哪里执行类型转换。

【讨论】:

    【解决方案2】:

    这个-

    scanf("%c",&i);
    

    传递了错误的参数(%c 需要 char 的地址)。它调用 未定义的行为。

    【讨论】:

    • @lol 用标志-Wall -Werror 编译它,看看你得到了什么。
    • 如果char 保证小于或等于到int(大多小于),为什么是UB?您会收到警告,但您将有足够的内存空间来存储它。从scanf 的角度来看这是错误的,它正在等待char * 并得到int *。
    • @EnzoFerber 我只在scanf 的上下文中说UB。如果传递错误的参数将导致它。
    • @lol 正确的输出,你知道如果有 UB,你可以得到任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多