为什么常量的语法中没有符号标识?

4
为什么标准在常量语法中不包含符号字符?
它只提到数字,符号字符只存在于指数中。

2
哪个标准? - DYZ
6
这实际上是一个相当有见地的问题。我不明白为什么会有负投票和关闭投票。 - Sergey Kalinichenko
1
@DYZ:鉴于该问题被标记为C,似乎可以选择的标准数量有限,并且我怀疑它们中没有任何一个在这方面有所不同。 - Dolda2000
3
两个答案都是正确的,-1 不是一个常量,而是由一元减号运算符应用于常量 1 得到的表达式。这可能会导致问题。例如,假设 int 的范围为 -32768 .. +32767。那么表达式 -32768 不是类型为 int 的常量。常量 32768 的类型是 long,而一元减号不会改变它的类型。 - Keith Thompson
@Dolda2000 什么是 符号字符 - MD XF
显示剩余6条评论
2个回答

7
标准不会在数字文字前面加上符号,因为这是多余的。语法已经将符号作为一元正号 + 和一元负号 - 操作符的一部分捕获。当您编写
int a = -4;

右侧的语法可以适当地描述为一元减号表达式,其操作数为4。这是标准采用的方法。

只是为了明确,这是否足以处理像在二进制补码系统中INT_MIN这样的东西,其中INT_MIN的绝对值不能表示为一个int?我不是关于这种事情的语言律师;我会假设将两个元素分开会在操作数(没有符号)本身不合法时引起问题。 - ShadowRanger
2
@ShadowRanger:字面常量本身不需要符合 int 的范围。你可以将它们视为任意精度的整数,需要时进行数据类型转换即可。 - Dolda2000
3
不,每个字面值(C标准称其为“常量”,但概念相同)都有特定的类型。规则在N1570的6.4.1.1节中。一个未后缀的十进制整数常量的类型是它的值适合的intlong intlong long int中的第一个。 - Keith Thompson
3
@ShadowRanger:这可能会成为一个问题。如果 INT_MIN 是 -32768,则表达式 -32768 的类型是 long,而不是 int 类型。您可能会在 <limits.h> 中看到 INT_MIN 的定义类似于 (-32767-1) - Keith Thompson
@KeithThompson:哦,真的吗?我不知道,谢谢你的纠正。我真的应该有一天阅读标准。 - Dolda2000
@KeithThompson:5.2.4.2.1p1(“_...以下应替换为具有与根据整数提升转换的相应类型的对象的表达式相同类型的表达式..._”)不是更合适吗? - too honest for this site

5
如果 - 是常数 -2 的一部分,那么 4-2 就会成为语法错误(因为一个标记始终是最长可能的字符序列)。此外,-2147483648- 2147483648 的语义将不同(第一个将是 int,第二个将是 long,假设 int 是32位,long 更长)。这两件事都会令人困惑。
如果 - 总是一个运算符,-2147483648 的语义有时会有些出乎意料,但更常见的 x-1 的结果如预期一样。所以大多数编程语言,包括 C 语言,都是这样工作的。

a++++b是一个有效的表达式(实际上两者都不是语法错误)。添加空格使两个表达式都有效:a++ + ++b4 - 2。这不是一个有效的理由。简单的答案是:没有必要,因为对于非常量,-运算符是必需的。 - too honest for this site
1
@Olaf:是的,但大多数语言并不要求您在4-2中放置空格,并且许多语言中有很多代码表明,并非所有程序员都希望这样做。语言设计者倾向于为其用户设计。 (还有他们自己:K&R并不是空格的重度消费者。) - rici
不需要负整数常量只是没有空格的副作用。主要原因是它简化了扫描器和解析器,因为不需要两次实现相同的语义(常量和变量的否定)。 - too honest for this site

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接