显式转换有多少级别?

Nit*_*gla 1 c++ casting literals implicit-conversion

代码片段#1

int n = 46341;
long long value = ((long long) (n * (n + 1))) / 2;
std::cout << value; // -1073716337 -- WRONG!
Run Code Online (Sandbox Code Playgroud)

代码片段#2

int n = 46341;
long long value = (long long)((long long)((long long)n * ((long long)n + 1))) / 2;
std::cout << value; // 1073767311 -- CORRECT!
Run Code Online (Sandbox Code Playgroud)

需要多少级显式转换才能产生所需的结果?

Sil*_*olo 5

一。作为一般规则,算术表达式的结果将采用两者中较大者的类型。

long long value = (n * (static_cast<long long>(n) + 1)) / 2;
Run Code Online (Sandbox Code Playgroud)

a和 an(long long)n + 1相加也是如此,所以结果是。然后是 an和 a的乘法,所以我们再次取较大的,依此类推。long longintlong longn * (...)intlong long

但是,正如评论中指出的那样,您可能应该临时做一个,以便将选角恶作剧与实际数学分开。

long long n0 = n;
long long value = (n0 * (n0 + 1)) / 2;
Run Code Online (Sandbox Code Playgroud)

现在有两行:一行将变量转换为更大的类型,另一行是纯数学的。一目了然地更具可读性。

注意:我使用的static_cast不是旧的 C 风格语法。您可以在 StackOverflow 及其姊妹网站上找到 几个 关于为什么这是一个好主意的问题,所以我不会在这里重复这个推理,只是指出这是一个好主意。