为什么我可以在C中赋值/比较int和char ?
Why can I assign/compare int and char in 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
循环中,我比较了c
,这是char
和EOF
,这是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区分为数据。
- 比较if语句中的数组值和int值
- 比较两个整数在C++中与未知 int 类型的相等性
- 与 string.size() 比较时 int 的符号性显示警告
- 错误:运算符 [] 不匹配。在比较列表中的 int 和 int 时<int>,
- 在 IF 语句中比较 int 时出现奇怪的行为
- std::<int>betterer() 比较器与 partial_copy_sort 的困难,在 Mac OSX 上"no matching function call.."
- 无符号int的比较始终是正确的(NPOS问题?)
- 有没有办法比较用 int 初始化的 char 类型的数组的 2 个元素
- 将 int 与 double 进行比较的预处理器"invalid integer constant expression"
- 为 map<int、pair<int、int 创建比较器>>
- 如何使用将 const int 的运算符用作 int* 优先级队列的比较器
- 将无符号的 int 与 std::string::size_type 进行比较是否安全
- React Native 0.40.0:指针和零之间的有序比较("NSNumber *"和"int")
- 比较 C 中的两个 int 数组
- 如果我在与字符进行比较之前没有明确将 int 转换为字符,这有关系吗?
- C++ 中有符号 int 和无符号 short 的比较
- 如何将INT数字[1]的值与数字[2] C 进行比较
- C 比较两个INT,错误或Wierd End
- c++ int比较效率
- float与int比较所需的额外时间