【问题标题】:Is 0 a decimal literal or an octal literal?0 是十进制文字还是八进制文字?
【发布时间】:2011-10-17 06:06:10
【问题描述】:

零总是零,所以没关系。但在最近与一位朋友的讨论中,他说八进制文字今天几乎没有使用。 然后我突然意识到,实际上我的代码中几乎所有整数文字八进制的,即0

根据 C++ 语法,0 是八进制文字吗?标准是怎么说的?

我知道的唯一真正用途是用于 unix 文件权限。

【问题讨论】:

  • Java 也是这样吗?
  • +1 提出了一个完全不相关的问题并获得了大量的支持 :-)
  • 我认为即时代表 SO 的方法不是一个深奥的问题,而是一个特殊的问题,它的答案会让你在饮水机上获得极客的信任 :)
  • 很棒的问题 :) 我在Java Language Spec 中查找它,在 Java 中它是十进制的。该规范甚至包含以下引用:请注意,八进制数字总是由两个或多个数字组成; 0 总是被认为是一个十进制数字——实际上这并不重要,因为数字 0、00 和 0x0 都表示完全相同的整数值。
  • 我几乎想发表一个回答说“是的,0 是十进制文字或八进制文字。”

标签: c++ zero octal


【解决方案1】:

是的,0 是 C++ 中的八进制文字

根据 C++ 标准:

2.14.2 整数字面量 [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

【讨论】:

  • 另一个重要的一点是 decimal-literal 是一个 nonzero-digit 后跟零个或多个 digit所以没有歧义。
  • @MSalters:对于您的版本,您必须额外指定首选项:如果 both octal-literaldecimal-literal 是字节模式的可能解释,请选择 @987654325 @。官方标准的措辞没有这个问题。
  • @MSalters:您仍然不能将 decimal-literal 作为任意位数,它必须是单个零或非零数字,后跟任意数字,否则 every 八进制文字可以解释为十进制文字。我现在可以看到编译错误:ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
  • @MSalters 在您的示例中,0123 将匹配八进制文字和十进制文字,但无论哪种方式都有不同的含义。
  • @CharlesBailey - FTFY,1 仍然是八进制的;P - ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
【解决方案2】:

任何以0 为前缀的整数值都是八进制值。即:01 为八进制 1,010 为八进制 10,即十进制 8,0 为八进制 0(即十进制,其他为 0)。

所以是的,'0' 是一个八进制数。

这是@Als 回答中语法 sn-p 的简单英文翻译 :-)


0x 为前缀的整数不是0 为前缀的整数。 0x 是一个明显不同的前缀。显然有些人无法区分。

按照同样的标准,如果我们继续:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

【讨论】:

  • "任何以 '0' 开头的整数值都是八进制值。"不对。示例:0xA 以“0”开头,是一个整数值。
  • 0x 不是令牌。以0x 开头的整数文字是单个标记。
  • 你引用的那个定义的来源是什么? “令牌”一词由 C (N1570 6.4) 和 C++ (C++11 2.7 [lex.token]) 标准在语法上定义。 0x 不符合条件。 (至少在 C 中,它是一个预处理数字(N1570 6.4.8),如果它不是十六进制常量的一部分,但那不是一个标记。)
  • 我们正在讨论整数常量/文字的语法由 C 和 C++ 标准定义。标准对“令牌”的定义如何不是在这种情况下使用的最合适的定义?你这种侮辱性的屈尊是不恰当的。如果你认为我在你的回答中指出我认为是技术错误的东西是一个欺负者,我建议你应该重新考虑这个词的含义。 (你从来没有回答我关于你的定义来源的问题。)
  • 如果有人好奇的话,“令牌是一个或多个作为一个组具有重要意义的字符的字符串。”的声明似乎来自this Wikipedia article
【解决方案3】:

显然所有以零开头的整数文字实际上都是八进制的。这意味着它也包括 0。这几乎没有什么区别,因为零就是零。但是不知道这个事实会伤害你。

当我尝试编写一个将二进制数转换为十进制和十六进制输出的程序时,我意识到了这一点。每次我给出一个以零开头的数字时,我都会得到错误的输出(例如,012 = 10,而不是 12)。

很高兴知道这些信息,这样您就不会犯同样的错误。

【讨论】:

  • 以零开头但零后没有“x”的整数字面量。
  • 没有证据的断言“是”也不是答案。
  • 按照这个逻辑,09 是一个八进制数。
  • @0xc0de: 不,09 不是八进制数,因为它根本不是数字;它与任何类型的整数文字的语法都不匹配。
  • 我很确定@0xc0de 知道 09 不是八进制数。所说的是,“按照这个逻辑09 是一个八进制数。”言下之意,既然09不是八进制数,逻辑肯定是错的。
猜你喜欢
  • 2014-12-24
  • 2013-06-09
  • 1970-01-01
  • 2014-03-11
  • 2012-12-12
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多