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
是否首先进行强制转换,这会改变表达式其余部分的求值精度。