【发布时间】:2013-11-25 10:04:00
【问题描述】:
在 C++ 中对负常数使用无符号后缀是一种好习惯吗?
例如,使用安全吗,
foo(-1ull);
而不是
foo(unsigned long long(-1));
【问题讨论】:
-
正如 AndreyT 指出的那样, foo(unsigned long long(-1)) 在语法上是错误的。它应该是 foo((unsigned long long)(-1))。
在 C++ 中对负常数使用无符号后缀是一种好习惯吗?
例如,使用安全吗,
foo(-1ull);
而不是
foo(unsigned long long(-1));
【问题讨论】:
它并没有真正用于“负常数”。 C++ 中的常量(文字)总是非负的。因此,您在这里拥有的是文字 1ull,前面带有一元 - 运算符。这意味着您的第一个变体的确切语义可以直接表示为
-(unsigned long long) 1
但不像
(unsigned long long) -1
(尽管最终两者产生相同的结果)。
顺便说一句,您写的第二个变体在语法上不正确。 “多字”类型名称不能用于函数式类型转换。 usigned(-1) 是合法的,但 unsigned int(-1) 不是。 unsigned long long(-1) 也是非法的。
但是让我们假设我理解你的第二个变体试图表达的意思。在这种假设下,两种变体都做同样的事情,因此您可以使用其中任何一种,具体取决于个人偏好或编码标准。第一个显然更短。
【讨论】: