C编程 : If I put integer into a char array, 那么打印出来的数字是什么类型呢?

标签 c

这是我的代码:

#include "stdio.h"
#include "stdlib.h"
int main()
{
    char array[50];
    int i = 0;
    while (i < 50)
    {
        array[i] = rand();
        printf("%d\n", array[i]);
        i = i + 1;
    }
    return 0;
}

所以我生成伪随机数并将它们放入数组,但我的数组是字符,我放入的是整数。那么为什么我可以使用 %d?我以为 %d 告诉 printf array[i] 是一个 4 字节整数,printf 应该转换成字符串。但是 array[i] 是 char 而不是 int。有人可以向我解释一下吗。

最佳答案

printf 是可变参数函数。这意味着您可以向它传递任意数量的参数,然后该函数需要有一种方法来确定它们是什么。 printf 使用第一个参数格式字符串执行此操作,它必须与其他参数匹配。

现在,当您将任何较短的整数作为可变参数传递时,它会被提升为 int 类型。与无符号类型相同。 char 会发生这种情况,它会被提升为 int(或 unsigned int,具体取决于平台)。另一个例子是 float 被提升为 double,这就是为什么你没有打印 float 的格式,%f 还会打印一个 double(如果有疑问,请查看文档)。

这意味着对于 printf%c 格式实际上使用了一个 int 值(或无符号,具体取决于平台),因此您可以使用 %d 打印它没有问题(假设 char 已在您的平台上签名)。

在某些平台上,char 是无符号的,如果您启用了编译器警告,您实际上会收到一个警告,尝试使用 %d 打印无符号值,由于未定义的行为,这可能(在这种情况下非常理论上,但仍然)导致有趣的事情。

关于C编程 : If I put integer into a char array, 那么打印出来的数字是什么类型呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52487040/

相关文章:

c - 在小数点前显示固定宽度的 float

C - 激活记录中变量的地址

c - 常量的按位或

c - 信号不会在 execv() 中正确重新启用

C 3G 文件传输客户端/服务器 Linux

c++ - 在线法官的测试环境

c - C : make function visible and callable through macro only (MSVC compiler) 中的函数可见性

c++ - 检查 BOOL 的值是否比更新它更有效?

c - 结构返回错误-C

c - 如果总和将高于 21,C,我需要帮助更改二十一点中 ace 的整数值