(type)(math expression)是否将表达式评估为此类型?

时间:2019-07-19 02:00:31

标签: c++ expression

最近,我正在处理竞争性编程中的一个问题,将(long long)(n*(n-1))/2更改为(long long)n*(n-1)/2会有所作为,这些东西不一样吗?

1 个答案:

答案 0 :(得分:1)

不,他们不一样。

根据C++ Operator Precedence,类型转换比算术运算具有更高的优先级。

因此,表达式:

(long long)(n*(n-1))/2

由编译器评估,就像是这样编写的:

(((long long)(n*(n-1)))/2)

即,整个表达式n*(n-1)在其自己的括号内,因此首先对其求值,然后将其结果强制转换为long long,然后将该结果除以{{1} }。

表达式:

2

由编译器评估,就像是这样编写的:

(long long)n*(n-1)/2

ie,((((long long)n)*(n-1))/2)不在括号内,因此它首先被自身强制转换为n,然后将该结果乘以long long,然后将该结果除以{{ 1}}。

如果不确定哪个表达式要在另一个表达式之前求值,则应该使用显式括号来控制要按哪个顺序执行的操作。