C 为什么常量的语法中没有符号字符?

C 为什么常量的语法中没有符号字符?,c,syntax,C,Syntax,为什么标准在常量语法中不包含符号字符 它只提到数字和符号字符,而符号字符只出现在指数中标准不考虑数字文字前面的符号,因为它是多余的 语法已经将符号作为一元加号+和一元减号-运算符的一部分捕获。当你写作时 int a = -4; 右侧的语法可以适当地描述为一元减-表达式,操作数为4。这是标准采用的方法。如果-是常量-2的一部分,则4-2将是语法错误(因为标记始终是可能的最长字符序列)。另外,-2147483648和-2147483648的语义也会不同(第一个是int,第二个是long,假设int

为什么标准在常量语法中不包含符号字符


它只提到数字和符号字符,而符号字符只出现在指数中

标准不考虑数字文字前面的符号,因为它是多余的

语法已经将符号作为一元加号
+
和一元减号
-
运算符的一部分捕获。当你写作时

int a = -4;

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

如果
-
是常量
-2
的一部分,则
4-2
将是语法错误(因为标记始终是可能的最长字符序列)。另外,
-2147483648
-2147483648
的语义也会不同(第一个是
int
,第二个是
long
,假设
int
是32位,
long
更长)。这两件事都会让人困惑


如果
-
始终是一个运算符,则
-2147483648
的语义有时有点出乎意料,但更常见的
x-1
工作正常。这就是包括C在内的大多数编程语言的工作原理

哪种标准?这实际上是一个很有见地的问题。我不明白否决票和结束票。@DYZ:鉴于问题标记为C,可供选择的标准数量似乎有限,我怀疑在这方面是否有任何不同。两个答案都是正确的
-1
不是常数,它是由一元
-
运算符组成的表达式,该运算符应用于常数
1
。这可能会导致问题。例如,假设
int
的范围为
-32768
<代码>+32767。那么表达式
-32768
不是
int
类型。常量
32768
的类型为
long
,一元
-
不会改变该类型。@MDXF:您发现有什么不清楚的地方吗?我不能说我自己在读它的时候偶然发现了什么。只是想澄清一下,在一个二元补码系统中,
INT\u MIN
的绝对值不能表示为
INT
时,这足以处理像
INT\u MIN
这样的东西吗?我不是这类事情的语言律师;我假设,当操作数(无符号)本身不合法时,分离这两个元素会导致问题。@ShadowRanger:文本本身不需要在
int
的范围内。您可以将它们视为任意精度整数,这些整数被“强制转换”为它们实际用作的数据类型。@Dolda2000:否,每个文本(C标准称它们为“常量”,但这是相同的想法)都有一个特定的类型。规则见第6.4.1.1节。无固定小数整型常量的类型是
int
long int
long-long int
中其值适合的第一个。@ShadowRanger:这可能是个问题。如果
INT\u MIN
为-32768,则表达式
-32768
的类型为
long
,而不是
INT
类型。您可能会看到
中定义的
INT\u MIN
类似于
(-32767-1)
@KeithThompson:哦,真的吗?我没有意识到这一点;谢谢你的更正。我真的应该有一天读一下《标准》,就像
a+++++b
(实际上两者都不是语法错误)。添加空格使两个表达式都有效:
a+++++b
4-2
。这不是一个合理的理由。简单的回答是:没有必要,因为非常量无论如何都需要
-
运算符。@Olaf:是的,但大多数语言不要求您在
4-2
中放置空格,而且在许多语言中有相当多的代码,这表明并非所有程序员都希望这样做。语言设计者倾向于为他们的用户设计。(以及他们自己:K&R并不是空白的大消费者。)不需要空格只是没有负整数常量的副作用。主要原因是它简化了扫描器和解析器,因为它们没有两次实现相同的语义(常量和变量的否定)。