为什么我可以在C中分配/比较int和char

时间:2011-09-10 17:45:07

标签: c++ c

我有这样的代码:

#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循环中,我将cchar进行了比较,EOFint,编译器不会抛出任何错误,我的程序也是如此执行!

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

提前致谢。

6 个答案:

答案 0 :(得分:9)

没有。它只是意味着返回的值为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来避免此类警告消息。

答案 1 :(得分:4)

我担心“动态编程语言”这个术语过于模糊,无法在这种情况下做出如此精细的区分。

虽然我认为隐式转换为一种数字类型不是动态语言特性,但只是语法糖。

答案 2 :(得分:3)

没有。让我们看看wikipedia的定义

  

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

你所演示的是C / C ++中的char和int几乎相同,并且C / C ++会自动在两者之间进行转换。而已。这里没有类型系统的修改。

答案 3 :(得分:1)

让我们重写你的代码来说明正在发生的事情

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

该计划的回报价值应该是多少? EOF不是char,但是你将它转换为char。当您进行比较时,该转换再次发生,并且它被压缩到相同的值。另一种重写方法,以明确发生了什么:

#include <stdio.h>
main()
{
    int c;
    c = getchar();
    while ((char)c != (char)EOF) {
        putchar((char)c);
        c = getchar();
    }
}
EOF被压扁了;如果被压扁它并不重要,它可以被压扁到字母“M”,但由于它每次都以相同的方式被压扁,你仍然将其视为EOF。

答案 4 :(得分:0)

C会让你做你想做的事,但你必须接受后果。如果要为char分配int,则可以。不会使它成为动态语言。

(顺便说一下,这个问题的标题应该是“为什么c让我为一个char赋予一个int?”并且只包含最后一段。但是可能这不会引起足够的注意。如果它我已经吸引了任何赞成,然后我会编辑标题,但由于不是我会留下它作为如何不提出问题的例子。)

答案 5 :(得分:0)

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