我有这样的代码:
#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
与char
进行了比较,EOF
为int
,编译器不会抛出任何错误,我的程序也是如此执行!
为什么编译器在上述两种情况下不会抛出任何错误?
提前致谢。
答案 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?”并且只包含最后一段。但是可能这不会引起足够的注意。如果它我已经吸引了任何赞成,然后我会编辑标题,但由于不是我会留下它作为如何不提出问题的例子。)
答案 5 :(得分:0)
如果您不读取7位ASCII数据,则\ xFF可能是有效数据。如果EOF是\ xFFFFFFFF并且你将getchar()的值返回给char,则无法将EOF与\ xFF区分为数据。