C编程语言中是否存在任何不一致性?

C编程语言中是否存在任何不一致性?,c,C,我在某个地方读到一位教授声称C编程语言中存在一些不一致之处。这是正确的吗?如果是,是什么 我相信我记得教授提出的论点是,你可以用一种类型(可能是char),但不能用另一种类型(可能是int),为了一致性,应该可以用C做一些你实际上做不到的事情 你知道我在这里的意思吗?还是没有人支持这个观点 相关的: 如果我理解正确,以上两个功能仅对char有效,这可能是因为char默认情况下可以签名或不签名,而int始终是签名的 虽然这可能是类型之间的不一致,但这不是我认为的错误——这是很好理解的(或者应该是)

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

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

你知道我在这里的意思吗?还是没有人支持这个观点

相关的:

如果我理解正确,以上两个功能仅对
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..."