最近,我正在处理竞争性编程中的一个问题,将(long long)(n*(n-1))/2
更改为(long long)n*(n-1)/2
会有所作为,这些东西不一样吗?
答案 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}}。
如果不确定哪个表达式要在另一个表达式之前求值,则应该使用显式括号来控制要按哪个顺序执行的操作。