【问题标题】:Using C am I right in thinking that literals beginning with multiple zeros are considered octal?使用 C 我是否认为以多个零开头的文字被认为是八进制的?
【发布时间】:2014-01-04 11:06:13
【问题描述】:

在下面的 C 代码中,所有这些定义都使用了八进制文字吗?即使它们以多个零开头?

#define TCL_REG_BASIC       000000  /* BREs (convenience). */
#define TCL_REG_EXTENDED    000001  /* EREs. */
#define TCL_REG_ADVF        000002  /* Advanced features in EREs. */
#define TCL_REG_ADVANCED    000003  /* AREs (which are also EREs). */
#define TCL_REG_QUOTE       000004  /* No special characters, none. */
#define TCL_REG_NOCASE      000010  /* Ignore case. */
#define TCL_REG_NOSUB       000020  /* Don't care about subexpressions. */
#define TCL_REG_EXPANDED    000040  /* Expanded format, white space & comments. */
#define TCL_REG_NLSTOP      000100  /* \n doesn't match . or [^ ] */
#define TCL_REG_NLANCH      000200  /* ^ matches after \n, $ before. */
#define TCL_REG_NEWLINE     000300  /* Newlines are line terminators. */
#define TCL_REG_CANMATCH    001000  /* Report details on partial/limited * matches. */

【问题讨论】:

  • 是的,没错,虽然它只需要一个前导零。
  • 尤其是如果它们以多个零开头 ;)(十六进制文字以 0x 开头)
  • 我只是想知道为什么有这么多前导零,哈哈。
  • 作者可能试图暗示位域的宽度。并希望他们都排好队
  • 蒂姆说了什么。这种东西非常标准(在 Windows 标题中到处使用)。

标签: c literals octal


【解决方案1】:

来自 C 标准,6.4.4.1 第 3 段:

八进制常数由前缀 0 (可选)后跟一系列数字 0 到 7 组成

【讨论】:

  • 当我发布我的答案时,你的答案不在这里!
  • @hacks 当我看到 paulsm4 已经回答时,我删除了它,但后来有人要求我将其添加回来......抱歉造成混淆。 :P
【解决方案2】:

是的,你是对的。

C11, 6.4.4.1 整数常量:

八进制常量由前缀 0 组成,可选地后跟一系列 仅限数字 07

【讨论】:

  • 出于好奇,什么不允许带前导零的小数文字?例如。就 GCC 和 MSVC 而言,08 是一个语法错误。
  • @doynax;从什么时候8 变成数字的八进制表示?为什么编译器不应该给出警告?我建议你阅读数字系统。
  • 我只是好奇将 08 识别为无效八进制数而不是正确的十进制文字的规则可能是什么,因为您似乎有方便的标准。没有真正的原因,只是我内心深处的律师想要在任何正式定义中挖洞。
  • @Nigel Harper:该死。而且我想这里的0-7位数字序列可能是空的,因此将“0”的情况作为(非常常见的)八进制文字覆盖
  • @doynax;这是完整的段落:A decimal constant begins with a nonzero digit and consists of a sequence of decimal digits. An octal constant consists of the prefix 0 optionally followed by a sequence of the digits 0 through 7 only. A hexadecimal constant consists of the prefix 0x or 0X followed by a sequence of the decimal digits and the letters a (or A) through f (or F) with values 10 through 15 respectively. 这清楚地表明十进制数不能以0 开头。继续…………
【解决方案3】:

是的。

http://www.cplusplus.com/doc/tutorial/constants/

除了十进制数字(我们大多数人每天都使用的数字), C++ 允许使用八进制数(以 8 为基数)和十六进制数 (base 16) 作为文字常量。对于八进制文字,数字是 前面有一个 0(零)字符。对于十六进制,它们是 前面是字符 0x(零,x)。例如,以下 字面常量都是等价的:

75         // decimal
0113       // octal
0x4b       // hexadecimal  

【讨论】:

  • 技术上的问题是关于 C 的,但幸运的是 C 和 C++ 在这方面是相同的
【解决方案4】:

OP 的示例都是八进制的,因为它们以 0 开头。多个前导零或 8 或 9 的存在不会将其更改为八进制。 8 或 9 应该会导致错误。


仅供参考:在 C 中出现了一些额外的事件(尽管可能不是文字),其中发生了十进制、八进制和十六进制解释。

虽然不是文字,但在 printf() 的格式字符串中,像 "%016llx" 这样的说明符不是八进制 016 宽度,而是标志 '0' 和十进制值 16

对于printf(),使用说明符"%a" 输出,输出格式为“[−]0xh.hhhh p±d”,其中有效数字为十六进制,指数为十进制。

在转义序列中没有十进制规范。一些示例如下:

\' \" \? \\ \a \b \f \n \r \t \v
\0   (octal)
\01   (octal)
\012   (octal)
\0123   (bad - only up to 3)
\x0 (hexadecimal)
\x01 (hexadecimal)
\x012 (hexadecimal)
\x0123 (hexadecimal)
\x01234… (hexadecimal)
\u1234 (hexadecimal)
\U00012345 (hexadecimal)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2012-01-30
    相关资源
    最近更新 更多