首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前处理号

前处理号
EN

Stack Overflow用户
提问于 2015-10-05 06:13:51
回答 2查看 625关注 0票数 2

在C++标准14 (lex.ppnumber)的第2.10节中,预处理编号定义为

代码语言:javascript
复制
pp-number
    digit
    . digit
    pp-number digit
    pp-number ' digit
    pp-number ' nondigit
    pp-number identifier-nondigit
    pp-number e sign
    pp-number E sign
    pp-number .

因此,这应该包括所有整数文字标记和所有浮动文字标记。但是,正如在2.14.4 (lex.fcon)中所写的,有一个标志是可选的,即(如果有一种方法将其格式化为标准,请随意改进)。

代码语言:javascript
复制
exponent-part:
    e sign_opt digit-sequence
    E sign_opt digit-sequence
sign: one of
    + -

为什么pp号定义中的符号不是可选的?实际上,数字1e3应该是浮动的-文字,而不是pp-数字,这与下面第2.10节的解释相矛盾。

有什么我不明白的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-05 06:38:55

引用这里

一个预处理数字有一个相当奇怪的定义。这个类别包括人们期望C的所有正常整数和浮点常量,但也包括一些最初可能无法识别为数字的事物。从形式上讲,预处理数字以可选句号、所需的十进制数字开始,然后继续使用任何字母序列、数字序列、下划线序列、句号序列和指数序列。指数是两个字符序列“e+”、“e-”、“E+”、“E-”、“p+”、“p-”、“P+”和“P-”。(以‘p’或‘P’开头的指数对C99来说是新的。它们用于十六进制浮点常数.) 这个不寻常定义的目的是将预处理程序从数字常量的全部复杂性中分离出来。不需要区分有效的浮点数和无效的浮点数,这是很复杂的。该定义还允许您在任何位置拆分一个标识符,并得到确切的两个标记,然后可以将其与‘##’操作符一起粘贴回。 预处理数字可能会导致程序被曲解。例如,0xE+12是一个预处理数字,它不会转换为任何有效的数字常量,因此是语法错误。这并不意味着0xE + 12,这可能是你想要的。

票数 4
EN

Stack Overflow用户

发布于 2021-11-04 23:22:08

实际上,数字"1e3“是一个有效的预处理号。你没有正确地读到语法的含义。一个数字,后面跟着一个标识符非数字(在这里是一个字母,在“e”中),后面跟着一个数字,确实符合语法。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32942283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档