Reputation: 732
I have a line of code
double i = 1 + (long)1.5* 5.0f
My question is what is the conversion order and the result? Been searching for examples like this, but to no avail. Any good guides out there that may help me understand it?
Upvotes: 4
Views: 703
Reputation: 254431
My question is what is the conversion order and the result?
The cast is applied to 1.5
, giving a long
with value 1
.
That's converted to float
for multiplication with 5.0f
, giving a float
with value 5.0f
.
1
is converted to float
for addition with that value, giving a float
with value 6.0f
.
Finally, that's promoted to double
(retaining the value 6.0
) to assign to i
.
This assumes a non-crazy floating point format that can represent small integers exactly; otherwise, there may be rounding errors.
If you wanted to cast the result of the multiplication, then use parentheses to control the operator precedence:
double i = 1 + (long)(1.5* 5.0f); // = 8.0
or use a C++-style cast, which forces the use of parentheses:
double i = 1 + static_cast<long>(1.5* 5.0f)
Any good guides out there that may help me understand it?
Here's one: http://en.cppreference.com/w/cpp/language/operator_precedence. Note that the type cast has a higher precedence than multiplication, which is in turn higher than addition (3 vs. 5 vs. 6).
Upvotes: 6
Reputation: 9733
If you're not sure what the precedence of the casting operator is then rewrite the expression (in your head)
(long)1.5 * 5.0
to
5.0 * (long)1.5
Here its pretty obvious what has precedence and its the same with the first version
Upvotes: 0
Reputation: 18218
As you can see from this table, the cast operator has higher precedence than multiplication, but follow the advice to use parentheses.
Upvotes: 1
Reputation: 7521
This precedence table should tell you everything you need to know.
1.5
is cast to a long
1.5 * 5.0f
, which casts this product as a float
1 + ( ((long) 1.5) * 5.0f)
i = 1 + ((long) 1.5 * 5.0f)
Upvotes: 0