为什么常量有类型修饰符?
Why are there type modifiers for constants?
我不明白文字常量的类型修饰符的用途是什么,比如数字常量:
75
75u
75l
75ul
75lu
在什么情况下这可能有用?我的意思是,如果您已经为变量类型声明了类型修饰符,我认为没有必要这样做。如果有人能帮助我理解这一点,那就太棒了!谢谢!
额外问题:"literal" 是否与 "constant" 相同,您可以直接说 "literal" 而不是 "literal constant" 吗?
有时文字 必须 具有特定类型。例如
void foo(const int&){
// pay myself
}
void foo(const unsigned&){
// reformat my disk
}
那么foo(75)
和foo(75u)
会有非常不同的结果。
事实上,如此 很有用,因为从 C++11 开始,可以定义您自己的文字类型。参见 http://en.cppreference.com/w/cpp/language/user_literal
对于整数文字,除了 Bathsheba 的回答中的内容外,它还用于各种情况,例如抑制警告
unsigned int n = somevalue;
...
if (n > 5) dosomething();
更改为 if (n > 5U)
将不再有警告。
或者当你做这样的事情时
long long x = 1 << 50;
发现x不是你所期望的,你需要把它改成
long long x = 1LL << 50;
C++11 中的 auto
关键字的另一种用法
auto a = 1;
auto b = 1U;
auto c = 1L;
auto d = 1UL;
以上将导致变量的不同类型
对于浮点字面量,使用后缀会得到更正确的结果
long double a = 0.01234567890123456789;
long double a = 0.01234567890123456789L;
那些may result in very very different values. That's because a literal without suffix is a double
literal value and will be rounded correctly to double, hence when long double
has more precision than double
it'll result in precision lost. The same will occur with float
s due to double-rounding(先加倍后浮,而不是直接四舍五入字面量浮)
if (0.67 == 0.67f)
std::cout << "Equal";
else
std::cout << "Not Equal";
The above will print out "Not Equal"
我看到的最常见的情况之一是 75ul << 18
。移位的输入需要有足够的位来允许移位。 75
可能是 16 位,移动超过 18 位未定义行为(坏)。 75ul
至少是 32 位。
我不明白文字常量的类型修饰符的用途是什么,比如数字常量:
75
75u
75l
75ul
75lu
在什么情况下这可能有用?我的意思是,如果您已经为变量类型声明了类型修饰符,我认为没有必要这样做。如果有人能帮助我理解这一点,那就太棒了!谢谢!
额外问题:"literal" 是否与 "constant" 相同,您可以直接说 "literal" 而不是 "literal constant" 吗?
有时文字 必须 具有特定类型。例如
void foo(const int&){
// pay myself
}
void foo(const unsigned&){
// reformat my disk
}
那么foo(75)
和foo(75u)
会有非常不同的结果。
事实上,如此 很有用,因为从 C++11 开始,可以定义您自己的文字类型。参见 http://en.cppreference.com/w/cpp/language/user_literal
对于整数文字,除了 Bathsheba 的回答中的内容外,它还用于各种情况,例如抑制警告
unsigned int n = somevalue;
...
if (n > 5) dosomething();
更改为 if (n > 5U)
将不再有警告。
或者当你做这样的事情时
long long x = 1 << 50;
发现x不是你所期望的,你需要把它改成
long long x = 1LL << 50;
C++11 中的 auto
关键字的另一种用法
auto a = 1;
auto b = 1U;
auto c = 1L;
auto d = 1UL;
以上将导致变量的不同类型
对于浮点字面量,使用后缀会得到更正确的结果
long double a = 0.01234567890123456789;
long double a = 0.01234567890123456789L;
那些may result in very very different values. That's because a literal without suffix is a double
literal value and will be rounded correctly to double, hence when long double
has more precision than double
it'll result in precision lost. The same will occur with float
s due to double-rounding(先加倍后浮,而不是直接四舍五入字面量浮)
if (0.67 == 0.67f)
std::cout << "Equal";
else
std::cout << "Not Equal";
The above will print out "Not Equal"
我看到的最常见的情况之一是 75ul << 18
。移位的输入需要有足够的位来允许移位。 75
可能是 16 位,移动超过 18 位未定义行为(坏)。 75ul
至少是 32 位。