//Using the if-else
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {
long number = 0; // Store input here
cout << "Enter an integer less than 2 billion: ";
cin >> number;
cout << endl;
if(number % 2L == 0) // Test remainder after division by 2
cout << "Your number is even." // Here if remainder is 0
<< endl;
else
cout << "Your number is odd." // Here if remainder is 1
<< endl;
return 0;
}
这里,在第一个'if'条件下,为什么他们在2之后有'L'?取出'L'似乎运行代码就好了。
答案 0 :(得分:11)
L
后缀用于表示数字文字的类型为long int
。通常,如果只是将值赋给变量,则没有必要,因为对于C ++11§2.14.2¶2(特别是表6),没有后缀的十进制整数文字将是第一种类型可以在int
,long int
或long long int
之间表示。 1
因此,您不会冒险将值本身截断;但是:
32768
可能是int
或long
,具体取决于平台/编译器); 因此,您需要在要确保文字类型为L
(或更大)的上下文中指定long
;脑海中浮现出两个重要案例:
解决重载问题;如果你有一个函数的两个重载,一个用于int
,一个用于long
,你想要确保调用long
,即使你传递一个小数字,你将不得不使用long
字面值;
void foo(int);
void foo(long);
foo(1); // <-- will call the first overload
foo(1L); // <-- will call the second overload
foo(32768); // <-- may call the first or the second overload, depending
// from the specific platform
foo(32768L); // <-- will call the second overload
但最重要的是:做算术时要避免意外;如果你执行例如像这样的乘法:
int a;
...
long v=32767*a; // don't let the "long" fool you - 32767*a is evaluated as an int!
32767
是int
字面值(因为它足够小以适合int
),a
是int
,结果将是int
,即使您要分配给long
。如果a
可能大到足以使计算失败,则可能会出现问题;通过指定long
字面值,您可以保证执行long
乘法。
long v=32767L*a; // now we are doing all the math with longs
(对于除法和FP文字,这个问题实际上 way 更频繁,通常你必须指定double
或float
文字来获得预期的“真正的划分”行为)
正如 @chris 所暗示的那样,当进行“大”位移时会出现更频繁的情况(同样类型),例如:
long long mask=1<<53;
提出了与上述相同的问题:1
是int
,53
是int
,计算将使用int
执行,结果溢出(尽管在这种特殊情况下,任何体面的编译器都会发出警告);这里正确的形式是:
long long mask=1LL<<53; // LL is the suffix for long long
来到您的特定代码:将L
带走是没有风险的;由于number
已经是long
,2
无论如何都会在模数中被提升为long
(根据“通常的算术转换”,§5¶10,和§4.5),所以这里L
没有区别。
但是,在许多情况下保留“预期类型”的字面值并不是一个坏主意:它保证,即使其他操作数的类型由于某种原因被更改为更窄的类型,计算仍然是以预期的方式完成(不是为了模数,它会有任何区别)。
整数文字的类型是表6中相应列表的第一个,其值可以是 表示。
答案 1 :(得分:0)
在这种情况下,没有必要。
L
表示长值,这意味着它会保留更多空间,只需计算超出正常整数的范围。