C++ (类型)(数学表达式)是否将表达式计算为此类型?

C++ (类型)(数学表达式)是否将表达式计算为此类型?,c++,expression,C++,Expression,最近,我在处理竞争性编程中的一个问题,将(long-long)(n*(n-1))/2更改为(long-long)n*(n-1)/2使情况有所不同,这些东西不一样吗?不,它们不一样 根据,类型转换的优先级高于算术运算 因此,表达式: (long-long)(n*(n-1))/2 由编译器进行计算,就像它是这样编写的: (((长)(n*(n-1)))/2) 也就是说,整个表达式n*(n-1)位于它自己的一组括号内,因此首先对其求值,然后将其结果转换为long,然后将该结果除以2 以及表达: (lon

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

不,它们不一样

根据,类型转换的优先级高于算术运算

因此,表达式:

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

由编译器进行计算,就像它是这样编写的:

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

也就是说,整个表达式
n*(n-1)
位于它自己的一组括号内,因此首先对其求值,然后将其结果转换为
long
,然后将该结果除以
2

以及表达:

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

由编译器进行计算,就像它是这样编写的:

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

也就是说,
n
不在括号内,因此它首先被自身铸造为
long
,然后将结果乘以
(n-1)
,然后将结果除以
2


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

@RemyLebeau为什么?如果
n=1000000
,第一个表达式可能返回错误的结果,因为
n*(n-1)
将超过32位int,什么时候第二个应该起作用,但为什么?我认为long将计算整个表达式(n*(n-1))/2@WeslleyMatheus请参阅我刚才发布的答案。@WesleyMatheus是的,并且只有
(键入)
旁边的
x
的第一个实例,而不是
中的
x
。+x*…
。如果你想得到整个表达式的结果,你需要在整个表达式周围加上一个括号:
(type)(x*(blablabla+x*blabla..)
类型(x*(blablablabla+x*blablabla..)
我从来没有得到这个“添加缺少的”括号的东西,这是你所有的例子似乎都在做的。他们什么也没变。关键在于表达式是否在强制转换之前进行求值(如在第一个exmaples中),或者
n
是否首先进行强制转换,这会改变表达式其余部分的求值精度。