在某处我读到一位教授声称C编程语言中存在一些不一致之处。这是正确的,如果是的话,它是什么?
我相信我记得教授提出的论点是你可以用一种类型(可能是char)而不是另一种类型(可能是int)做一些事情,为了保持一致性,应该可以做一些事情。你实际上不能用C。
你知道我在这里的意思还是不支持这个概念?
相关:https://stackoverflow.com/questions/3486059/inconsistency-in-programming-languages
答案 0 :(得分:3)
有几个:
char x[]
声明数组或指针,具体取决于它出现的位置(在函数参数中或不在函数中)"str"
表现为数组(sizeof("str")
或char s[] = "str"
)或指针(puts("str");
中)"str"
属于char*
类型,但您无法合法修改其指向的内容,如果它是const char*
%f
中使用double
printf()
,但%lf
使用double
而%f
使用float
{ {1}}但您对scanf()
常量使用f
(例如float
)1.0f
,不太有意义-1 > 1u
与UINT_MAX + 1 + 1.0
相差很多,也可能相当令人惊讶但是几乎无处不在。
答案 1 :(得分:1)
可能是char
默认情况下可以签名或无签名的事实,而int
始终是签名的。
但是,虽然这可能是类型之间的不一致,但这不是我认为是错误的 - 它很好理解(或应该是)。
也可能是&
地址 - 运算符无法寻址子字符类型(即位域),而其他类型如char
,int
和用户定义结构是。这是因为可以在单个地址组合多个位域。
我不怀疑你能在C中发现其他五十个不一致的内容,其中任何一个都不能成为抛弃语言的理由。
答案 2 :(得分:1)
"...is some inconsistency..."
不,这是不正确的,有许多不一致,复数。要列举所有这些问题,需要一篇很多页面的文章。总结一下:你能做的最糟糕的事情就是假设C语言是理智的,一致的或合乎逻辑的。
关于char的特定问题,C中有一条规则保证所有整数类型都是隐式签名的。例如,写int
总是完全等同于编写signed int
。这适用于int, long, short, long long
,但不适用于char
。
这是因为char不仅是最小的整数类型,而且还用于存储字符,即ASCII符号值。默认情况下,char是有符号还是无符号是实现定义的:编译器可以选择任一形式。
原因是,如果我没记错的话,C编译器在C的第一次标准化之前制作的一些古老的向后兼容性问题以不同的方式实现了char。
char和其他“小整数类型”(short和bool)的另一个问题是,只要它们是表达式的一部分,它们就会以一种与提升大整数类型不一致的方式隐式地进行类型提升。这被称为整数提升规则,是“通常的算术转换”(more info here)的一部分,这是C语言不一致且不合逻辑的另一个完美例子。
答案 3 :(得分:1)
可能是char
不允许填充位,而int
是:unsigned char
值的范围始终为2
CHAR_BIT
wide,而signed char
的范围可能少一个 - int
类型的范围无法根据其大小和CHAR_BIT
的值来确定(除非{{ 1}}是8和CHAR_BIT
2)。
答案 4 :(得分:0)
char str[] = "Hello";
const char *str2 = "World";
如果我理解正确,以上是2个仅对char