在C++标准14 (lex.ppnumber)的第2.10节中,预处理编号定义为
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)中所写的,有一个标志是可选的,即(如果有一种方法将其格式化为标准,请随意改进)。
exponent-part:
e sign_opt digit-sequence
E sign_opt digit-sequence
sign: one of
+ -为什么pp号定义中的符号不是可选的?实际上,数字1e3应该是浮动的-文字,而不是pp-数字,这与下面第2.10节的解释相矛盾。
有什么我不明白的吗?
发布于 2015-10-05 06:38:55
引用这里
一个预处理数字有一个相当奇怪的定义。这个类别包括人们期望C的所有正常整数和浮点常量,但也包括一些最初可能无法识别为数字的事物。从形式上讲,预处理数字以可选句号、所需的十进制数字开始,然后继续使用任何字母序列、数字序列、下划线序列、句号序列和指数序列。指数是两个字符序列“e+”、“e-”、“E+”、“E-”、“p+”、“p-”、“P+”和“P-”。(以‘p’或‘P’开头的指数对C99来说是新的。它们用于十六进制浮点常数.) 这个不寻常定义的目的是将预处理程序从数字常量的全部复杂性中分离出来。不需要区分有效的浮点数和无效的浮点数,这是很复杂的。该定义还允许您在任何位置拆分一个标识符,并得到确切的两个标记,然后可以将其与‘##’操作符一起粘贴回。 预处理数字可能会导致程序被曲解。例如,0xE+12是一个预处理数字,它不会转换为任何有效的数字常量,因此是语法错误。这并不意味着0xE + 12,这可能是你想要的。
发布于 2021-11-04 23:22:08
实际上,数字"1e3“是一个有效的预处理号。你没有正确地读到语法的含义。一个数字,后面跟着一个标识符非数字(在这里是一个字母,在“e”中),后面跟着一个数字,确实符合语法。
https://stackoverflow.com/questions/32942283
复制相似问题