C编程语言中是否存在任何不一致性?
我在某个地方读到一位教授声称C编程语言中存在一些不一致之处。这是正确的吗?如果是,是什么 我相信我记得教授提出的论点是,你可以用一种类型(可能是char),但不能用另一种类型(可能是int),为了一致性,应该可以用C做一些你实际上做不到的事情 你知道我在这里的意思吗?还是没有人支持这个观点 相关的: 如果我理解正确,以上两个功能仅对C编程语言中是否存在任何不一致性?,c,C,我在某个地方读到一位教授声称C编程语言中存在一些不一致之处。这是正确的吗?如果是,是什么 我相信我记得教授提出的论点是,你可以用一种类型(可能是char),但不能用另一种类型(可能是int),为了一致性,应该可以用C做一些你实际上做不到的事情 你知道我在这里的意思吗?还是没有人支持这个观点 相关的: 如果我理解正确,以上两个功能仅对char有效,这可能是因为char默认情况下可以签名或不签名,而int始终是签名的 虽然这可能是类型之间的不一致,但这不是我认为的错误——这是很好理解的(或者应该是)
char
有效,这可能是因为char
默认情况下可以签名或不签名,而int
始终是签名的
虽然这可能是类型之间的不一致,但这不是我认为的错误——这是很好理解的(或者应该是)。
也可能是子字符类型(即,位字段)不能用运算符的&
地址寻址,而其他类型,如char
、int
和用户定义的结构则不能寻址。这是因为多个位字段可以组合在一个地址上
我毫不怀疑你能在C语言中发现另外50个小的不一致之处,没有一个是真正放弃这种语言的理由
"...is some inconsistency..."
不,这是不正确的,有很多不一致的地方,复数。列出所有这些问题需要一篇多页的文章。总而言之:你能做的最糟糕的事情就是假设C语言是健全的、一致的或合乎逻辑的
关于char的具体问题,C中有一条规则保证所有整数类型都是隐式签名的。例如,写入int
总是完全等同于写入带符号的int
。这适用于int、long、short、long-long
,但不适用于char
这是因为char不仅是最小的整数类型,而且还用于存储字符,即ASCII符号值。默认情况下,字符是有符号的还是无符号的是实现定义的:编译器可以选择任意一种形式
原因是,如果我没记错的话,一些古老的向后兼容性问题,在第一次C标准化之前,C编译器已经以不同的方式实现了char
char和其他“小整数类型”(short和bool)的另一个问题是,每当它们是表达式的一部分时,它们的隐式类型升级方式与大整数类型的升级方式不一致。这被称为整数提升规则,是“常用算术转换”()的一部分,这是C是一种不一致且不合逻辑的语言的另一个完美例子。有几个:
- 与其他类型不同,您不能将数组作为整个对象直接指定或传递
声明数组或指针,具体取决于数组或指针出现的位置(在函数参数中与否)char x[]
可以作为数组(在“str”
或sizeof(“str”)
)或指针(在char s[]=“str”
)put(“str”);
属于“str”
类型,但如果它是char*
const char*
- 在
中使用printf()
表示%f
,但在double
中使用scanf()
表示%lf
和double
表示%f
常量(例如float
)1.0f
,意义不大-1>1u
与UINT\u MAX+1+1.0
有很大不同,这可能也很令人惊讶UINT\u MAX+1.0+1
- 等
不过,几乎到处都有解决办法。可能是
char
不允许填充位,而int
是:无符号char
值的范围总是2
有符号字符
的最大值可能小于一个值,int
类型的范围不能根据其大小和char\u位的值来确定(除非char\u位
为8且sizeof(int)
2).从正交性的角度提到了一些不一致之处。这种类型的设计问题可能会引起争论,不适合StackOverflow的技术问答格式。因此,它可能会被关闭。不过,这正是程序员的主题。StackExchange.com-你应该在那里问它。谢谢你的回答。我不要求完全一致。我只是想了解更多关于C的知识。这怎么会是不一致的呢?这些语句是完全不同的。@cdarke我不是说这两个语句之间有什么区别,我是说每一个语句都没有等价的int
形式(没有小的-大的变化)。指针大小写可以与任何指针类型配合使用<代码>const banana_t*str2=“世界”代码>应该编译(但希望给出警告),除非它导致结果不一致,否则代码>是可以编译的;在这种情况下,它是未定义的行为。@Lundin那么说该语句仅在这种形式下有意义地有用是公平的吗?当然,我的观点是,我们不能以这种形式定义int
数组或banana\u t
数组。严格来说,banana\u t
大小写可能是有效的,只要它是一个包含n个字符的结构,并且没有对齐问题。但是当然,写banana_t*b={{'W','o'},{'r','l'},{'d','0'}会更好代码>
"...is some inconsistency..."