一个八进制字面量怎么可能是负数?

5
为什么 n 在这里?
const int n = -0123;

一个八进制字面量?我以为所有的八进制字面量都必须以0开头,但这个字面量没有,因为它以负号开头。
我知道这只是一个小问题,但它让我非常困惑!

6
连字符 - 是否是字面量的一部分? - Sotirios Delimanolis
1
我非常确定-0123以零开头。同样,您可以使用-0xFF表示-255和-0b010表示-2。 - Carl
6
不,我的意思是字面值为0123,而你对其应用了一元的-操作符。 - Sotirios Delimanolis
3
"0123" 表示字面量,"-" 表示负号。 - UnholySheep
1
更多有趣内容请参见:https://dev59.com/s1cO5IYBdhLWcg3wpTKW#45469321 - NathanOliver
显示剩余5条评论
3个回答

11

八进制字面量如何可能为负数?

没有负的整数字面量,只有正数。这里的字面量是0123,它以0开头,因此是八进制。- 在表达式中是一元减号运算符。


8

这是完全正确的。然而,所有整数字面量(十进制、十六进制、八进制和二进制)同样适用。实际上,没有负整数字面量。例如,表达式-1将一元减号运算符应用于字面量所代表的值,这可能涉及隐式类型转换(参考)。


1

您似乎对字面值有点困惑,因此:

简而言之,字面值是一种描述在代码中可以被直接看到的类型的方式。当您在代码中写入一个整数时,例如4,您可以直接看到它是数字四,除非它们后面有一个点(.)或任何其他有效的后缀,否则默认情况下将其解释为int

然而,你可以通过写入4u来告诉编译器将其解释为无符号数。现在,你可以看到它是数字4被解释为无符号数。同样,值"Hello World"是一个字符串字面量,因为你可以在代码中看到它是字符串"Hello World"。另一方面,用户定义的类Person没有在代码中以字面量方式出现的方法。在C++14中,你可以定义用户定义的字面量,但对于Person来说,这仍然没有意义。标准库在<chrono>头文件中使用这个功能,定义了如smsns等表示秒、毫秒和纳秒的字面量。
当写入八进制数-0123时,你告诉编译器以八进制值的方式解释它,就像0xFF以十六进制的方式直接解释一样。减号-只是一种将一元负号运算符应用于数字0123的方法。

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