0是十进制文字还是八进制文字?

ybu*_*ill 326 c++ zero octal

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

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

Alo*_*ave 295

是的,0是C++中的Octal文字.

根据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
Run Code Online (Sandbox Code Playgroud)

  • 另一个重点是_decimal-literal_是_nonzero-digit_后跟零或更多_digit_所以没有歧义. (39认同)
  • @MSalters:你仍然不能将_decimal-literal_作为任意数量的数字,它必须是单个零或非零数字后跟任何数字,否则_every_八进制文字可以被解释为十进制文字.我现在可以看到编译错误:`错误:0是不明确的,可能是八进制零或可能是十进制零.考虑使用(1 - 1)消除歧义. (23认同)
  • @CharlesBailey - FTFY,`1`仍然是八进制和全部; P - `ERROR:0是不明确的,可能是八进制零或可能是十进制零.考虑使用(8 - 8)来消除歧义 (5认同)
  • @MSalters:对于你的版本,你必须另外指定首选项:如果_both_`montal-literal`和`decimal-literal`是字节模式的可能解释,选择`octal-literal`.官方标准的措辞没有这个问题. (3认同)
  • @MSalters在你的例子中,0123将匹配八进制文字和十进制文字,但两种方式都有不同的含义. (3认同)
  • @Malcolm:在C的规范和Java的规范之间相当长的一段时间,编译器/词法分析器/解析器变得更加精细.这可能会影响决定.另外:没关系. (2认同)

lit*_*adv 44

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

所以是的,'0'是八进制.

这是@ Als答案中语法片段的简单英文翻译:-)


一个整数前缀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
Run Code Online (Sandbox Code Playgroud)

  • 我们正在讨论由C和C++标准*定义的整数常量/文字*的语法.在这种情况下,标准对"令牌"的定义如何不是最合适的?你的侮辱性屈尊是不合适的.如果你认为我是指责我认为你的答案中存在技术错误的恶霸,我建议你应该重新考虑这个词的含义.(你从来没有回答过关于定义来源的问题.) (11认同)
  • "以'0'开头的任何整数值都是八进制值." 不对.示例:0xA以"0"开头,是一个整数值. (5认同)
  • `0x`不是令牌.以"0x"开头的整数文字是单个标记. (4认同)
  • 您为该定义引用了哪些来源?单词"token"由C(N1570 6.4)和C++(C++ 11 2.7 [lex.token])标准*语法*定义.`0x`没有资格.(至少在C中,如果它不是十六进制常量的一部分,那么它是*预处理数*(N1570 6.4.8),但这不是一个令牌.) (4认同)
  • 如果有人好奇的话,"*一个令牌是一个或多个作为一个组重要的字符的字符串.*"的陈述似乎来自[这篇维基百科文章](http://en.wikipedia.org/wiki/ Lexical_analysis#令牌). (4认同)
  • @KeithThompson我使用的是“ token”一词,而不是C标准中的“ token”一词。我描述了基于语法分析文本时的“令牌”是什么。我知道很难理解人们对单词的定义存在差异,但是在计算机科学中,最被接受的定义不是您所指的那个。 (2认同)
  • 如果有人认为这是不正确的,他们可以自由地予以纠正。我不明白你的痴迷。 (2认同)