2

我在某处读到一位教授声称 C 编程语言存在一些不一致之处。这是正确的,如果是,它是什么?

我相信我记得教授提出的论点是你可以用一种类型(可能是 char)但不能用另一种类型(可能是 int)做一些事情,并且为了保持一致性,应该可以做一些你实际上可以做的事情不和C。

你知道我在这里的意思还是不支持这个概念?

相关:https ://stackoverflow.com/questions/3486059/inconsistency-in-programming-languages

4

5 回答 5

3

有几个:

  • 与其他类型不同,您不能将数组作为整个对象直接分配或传递
  • char x[]声明一个数组或一个指针,具体取决于它出现的位置(在函数参数中与否)
  • "str"表现为数组(insizeof("str")char s[] = "str")或指针(in puts("str");
  • "str"是 type char*,但你不能合法地修改它所指向的内容,如果它是const char*
  • 您使用%ffor doubleinprintf()但您使用%lffordouble%ffor floatinscanf()但您使用fforfloat常量(例如1.0f
  • -1 > 1u, 意义不大
  • UINT_MAX + 1 + 1.0与 有很大不同UINT_MAX + 1.0 + 1,也可能非常令人惊讶
  • ETC

不过,几乎到处都有解决方法。

于 2013-01-29T08:13:58.873 回答
1

可能char是默认情况下可以签名或未签名的事实,而int始终是签名的。

但是,虽然这可能是类型之间的不一致,但这不是我认为的错误——它很好理解(或者应该理解)。

也可能是子字符类型(即位域)不能使用&地址运算符寻址,而其他类型(如char,int和用户定义的结构)则可以。这是因为多个位域可以组合在一个地址上。

我不怀疑您会在 C 中找到其他 50 处细微的不一致之处,这些都不是放弃该语言的真正理由。

于 2013-01-29T07:23:33.237 回答
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)的另一个问题是,只要它们是表达式的一部分,它们就会以与提升更大整数类型的方式不一致的方式被隐式提升。这被称为整数提升规则,并且是“通常的算术转换”(更多信息在这里)的一部分,这是 C 是一种不一致且不合逻辑的语言的另一个完美示例。

于 2013-01-29T07:41:30.323 回答
1

也许char是不允许填充位,而intis:unsigned char值的范围总是2CHAR_BIT很宽,而 的范围signed char可能最多少一个——int类型的范围不能从它的大小和值来确定CHAR_BIT(除非CHAR_BIT是 8和sizeof (int)2)。

于 2013-01-29T08:28:41.507 回答
0
char str[] = "Hello";
const char *str2 = "World";

如果我理解正确,以上是 2 个仅对有意义的功能char

于 2013-01-29T07:23:01.277 回答