为什么我可以在C中赋值/比较int和char ?

Why can I assign/compare int and char in C

本文关键字:int 比较 char 赋值 我可以 为什么      更新时间:2023-10-16

我有这样的代码:

#include <stdio.h>
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}

C文档说getchar()返回int值。在上面的程序中,我们将c类型指定为int。最重要的是,EOF是头函数中定义的integer常量。

现在如果代码变成这样:

 #include <stdio.h>
    main()
    {
    char c;
    c = getchar();
    while (c != EOF) {
    putchar(c);
    c = getchar();
    }
    }

这段代码也可以工作!稍等一下,根据C文档getchar()返回int,但在上面的代码中,我将其存储在char中。C编译器不会抛出任何错误。而且在while循环中,我比较了c,这是charEOF,这是int,编译器不会抛出任何错误,我的程序执行!

为什么编译器在上述两种情况下不抛出任何错误?

No。它仅仅意味着返回值是int隐式地转换为char类型。

编译器可能会为这种转换生成警告消息,因为sizeof(int)大于sizeof(char)。例如,如果您在GCC中使用-Wconversion选项编译代码,它会给出这些警告消息:

c.c:5:7: warning: conversion to 'char' from 'int' may alter its value
c.c:8:8: warning: conversion to 'char' from 'int' may alter its value

这意味着,您应该使用int来避免此类警告消息。

恐怕"动态编程语言"这个术语的定义太模糊了,在这种情况下无法做出如此细微的区分。

尽管我认为从一种数字类型到另一种数字类型的隐式转换不是动态语言特性,而只是语法糖。

No。让我们看看维基百科的定义

这些行为可以包括扩展程序,通过添加new代码,通过扩展对象和定义,或通过修改类型系统,所有在程序执行期间。这些行为是可以模拟的在几乎所有足够复杂的语言中,除了动态语言提供直接的工具来使用它们。

你所演示的是C/c++中的char和int几乎是一样的,C/c++会自动在两者之间进行强制类型转换。仅此而已。这里没有修改类型系统

让我们重写你的代码来说明发生了什么

int main(int argc, char** argv)
{
    char c;
    c = EOF; /* supposing getchar() returns eof */
    return (c == EOF) ? 0 : 1;
}

这个程序的返回值应该是什么?EOF不是字符,但将其强制转换为字符。当您进行比较时,会再次进行强制转换,并将其压缩为相同的值。另一种重写的方法是:

#include <stdio.h>
main()
{
    int c;
    c = getchar();
    while ((char)c != (char)EOF) {
        putchar((char)c);
        c = getchar();
    }
}

EOF被压扁;它如何被压扁并不重要,它可以被压成字母M,但由于它每次都以同样的方式被压扁,你仍然把它看作EOF。

C会让你做你想做的事,但你必须接受后果。如果你想把整型赋值给char类型,你可以这么做。不使它成为动态语言。

(顺便说一句,这个问题的标题应该是"为什么c允许我将int赋值给char?",并且只包含最后一段。但这可能不会引起足够的关注。如果它吸引了一些赞,那么我就会编辑标题,但既然没有,我就把它作为一个如何不问问题的例子。

如果您不读取7位ASCII数据,则xFF可能是有效数据。如果EOF为xFFFFFFFF,并且您将getchar()的值返回为char,那么您无法将EOF与xFF区分为数据。