【问题标题】:Is 0 an octal or a decimal in C? [duplicate]0是C中的八进制还是十进制? [复制]
【发布时间】:2014-12-24 20:38:14
【问题描述】:

我已阅读this。它在 C++ 中是八进制,在 Java 中是十进制。但是没有关于C的描述?

0 是八进制还是十进制会有什么不同吗?这是我的面试官问的问题。我说不,我解释说不管是八进制还是十进制,它总是0。

然后他问为什么它在 C++ 中被视为八进制而在 Java 中被视为十进制。我说这是标准。请让我知道它在C中是什么?会有什么不同吗?为什么它们在不同的标准上有所不同?

【问题讨论】:

  • 没关系。它在八进制、十进制、二进制、base 42 中为零...
  • 在不同的标准中是不同的,因为这样写标准更容易。它没有实际意义。
  • @user3801433 “为什么”只是“因为标准作者是这样写的”。既然它真的没关系,我认为不值得尝试“正确”或太在意。在任何一种情况下,位都是相同的,这很重要。
  • @JoshuaTaylor “张贴在 SO”!
  • @JanHudec 这有点跑题了,但是 C++ 不向后兼容 C。int class = 5;。我相信 Objective-C 是。

标签: c language-lawyer literals octal


【解决方案1】:

差别不大,但形式上整数常量0 在 C 中是八进制。根据 C99 和 C11 标准,6.4.4.1 整数常量

整数常量
十进制常量 整数后缀opt
八进制常量 整数后缀opt
十六进制常量 整数后缀opt

十进制常量
非零数字
十进制常数 数字

八进制常数
0
八进制常数 八进制数

十六进制常量
...
...

【讨论】:

  • @juanchopanza “会有什么不同吗?为什么他们在不同的标准上会有所不同?”仍然没有答案。如果您有任何信息,请分享
  • @juanchopanza 因为它是八进制的,这是否意味着某些编译器(我正在考虑例如微控制器的 avr-gcc)可以将“0”优化为单个字节?而如果它是十进制,也许它的大小与 int 相同?
  • @MikeS 这不会有什么不同。文字仍然是int 类型。编译器可以做任何标准允许的事情,不管文字的基础是什么。
【解决方案2】:

八进制。

C11 §6.4.4.1 整数常量

octal-constant:
    0
    octal-constant octal-digit

C89 §3.1.3.2以来就是如此。

【讨论】:

    【解决方案3】:

    然后他问为什么它在 C++ 中被认为是八进制而在 Java 中被认为是十进制

    为了完整起见,Java 规范也值得一提。来自Java Language Specification 3.10.1

    DecimalNumeral:
        0
        NonZeroDigit Digitsopt
        NonZeroDigit Underscores Digits
    

    十进制数字可以是单个 ASCII 数字 0,表示整数零,或者由 1 到 9 的 ASCII 数字组成,可选地后跟一个或多个 0 到 9 的 ASCII 数字,中间夹有下划线,表示正整数。

    OctalNumeral:
        0 OctalDigits
        0 Underscores OctalDigits
    

    八进制数字由一个 ASCII 数字 0 后跟一个或多个 ASCII 数字 0 到 7 和下划线组成,可以表示正整数、零整数或负整数。

    如您所见,0 被视为十进制。 而以0 开头的任何(非空)数字序列都被视为八进制

    有趣的是,从那个语法来看:

    • 0 是十进制
    • 但是 00 是八进制

    【讨论】:

    • 有趣。所以它在java中也被认为是八进制的!!
    • @user3801433 “所以它在java中也被认为是八进制” 不完全是:从那个语法来看,一个裸露的0被认为是DecimalNumeral。但是00 被认为是OctalNumeral...
    【解决方案4】:

    来自 C 标准(6.4.4.1 整数常量)

    octal-constant:
    0
    octal-constant octal-digit
    

    事实上,零没有任何区别,因为零是八进制、十进制和十六进制数字的共同数字。只有当一个数字除了单个(前导)零之外还有其他数字时,它才有意义。

    考虑到没有十进制、八进制或十六进制等整数类型。

    【讨论】:

    • 即使没有“十六进制”类型,以十六进制表示特定值的常量也可能与以十进制表示相同值的常量不同。例如,如果 int 是 16 位,则 0x8000 将是 unsigned int 类型,但 32768 将是 long 类型。我不认为任何这样的问题对于常数零有意义,但对于更大的值,它们肯定是有意义的。
    【解决方案5】:

    这是一个八进制。请参阅 N1570 草案的6.4.4.1 Integer constants 部分:

          integer-constant:
                decimal-constant integer-suffixopt
                octal-constant integer-suffixopt
                hexadecimal-constant integer-suffixopt
          decimal-constant:
                nonzero-digit
                decimal-constant digit
          octal-constant:
                0
                octal-constant octal-digit
          hexadecimal-constant:
                hexadecimal-prefix hexadecimal-digit
                hexadecimal-constant hexadecimal-digit
          hexadecimal-prefix: one of
                0x   0X
          nonzero-digit: one of
                1   2   3   4   5   6   7   8   9
          octal-digit: one of
                0   1   2   3   4   5   6   7
          hexadecimal-digit: one of
                0   1   2   3   4   5   6   7   8   9
                a   b   c   d   e   f
                A   B   C   D   E   F
          integer-suffix:
                unsigned-suffix long-suffixopt
                unsigned-suffix long-long-suffix
                long-suffix unsigned-suffixopt
                long-long-suffix unsigned-suffixopt
          unsigned-suffix: one of
                u   U
          long-suffix: one of
                l   L
          long-long-suffix: one of
                ll   LL
    

    还有:

    1. 十进制常量以非零数字开头,由一系列十进制数字组成。八进制常数由前缀 0 组成,可选地后跟数字 0 到 7 的序列。十六进制常量由前缀 0x 或 0X 后跟一系列十进制数字和字母 a(或 A)到 f(或 F)组成,值分别为 10 到 15。

    【讨论】:

    • 您的列表不包括终结符digit,这是完全指定decimal-constant所必需的。
    • @arootbeer 虽然你说得对,但这里不需要,因为关键是0 明确列在octal-constant 下。
    • @glglgl 您的说法是正确的,但我并不是要争辩说这个答案没有解决关键点,只是为了提供改进的想法。我只是去看了标准,@starrify 复制了该部分字符作为字符; digit 的定义实际上在 §6.4.2.1 - 通用标识符中。
    【解决方案6】:

    我认为这取决于编译器的实现。我们必须查看源代码来确定它是否将“0”常量标记为八进制。我可以这样定义非八进制原因:八进制有“0”前缀。但是没有前缀。如果常数是 00,那么它就是八进制 - “八进制零” :)

    【讨论】:

    • 它不依赖于编译器的实现。它在标准中定义为八进制常数。查看其他答案。
    • 您可以阅读上面的答案:“...有趣的是,从该语法来看: •0 是十进制 •但 00 是八进制”
    • 您确实明白,尽管答案都说0 是否为八进制 依赖于实现。它在标准中定义为八进制常量。
    猜你喜欢
    • 2011-10-17
    • 2013-06-09
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多