2015-01-22 3 views
0

Если у меня есть выражение, как следующее:Как операнды продвигаются в длинном выражении?

double d = floatVar/intVar; 

intVar будет продвинут на float, а затем вернулся float результат будет преобразован в double и назначенную d. Но что произойдет, если у меня есть длинное выражение, например:

double d = floatVar/intVar * shortVar + charVar + intVar2; 

ли все переменные быть повышен до float, а затем вернулся float результат будет преобразован в double и назначен d?

Кроме того, если у меня есть следующие:

double d = (floatVar/intVar) * shortVar + charVar + intVar2; 

Будет intVar быть преобразованы в float, в то время как shortVar и charVar будут преобразованы в int, а затем вернулся int результат от shortVar + charVar + intVar2 будет преобразован в float и умножается на возвращаемый float результат (floatVar/intVar), и этот результат возвращается float результат будет преобразован в двойной и назначен d?

+0

Да, да, да, да и да. – EJP

ответ

2

Применяется порядок действий. / и * и + все левоассоциативные и / и * имеют одинаковый приоритет (что больше, чем у +), так что:

double b = floatVar/intVar * shortVar + charVar + intVar2; 

эквивалентно следующему:

double b = (((floatVar/intVar) * shortVar) + charVar) + intVar2; 

На каждом этапе выполняются соответствующие преобразования: intVar преобразуется в float, shortVar преобразуется в float, charVar является conve до float, intVar2 преобразуется в float. Конечный результат повышается до double.

Если, с другой стороны, вы должны были обернуть charVar + intVar2 в скобки, чтобы заставить эту операцию провести первый, то charVar будет повышен до int (при условии, что диапазон char вписывается в диапазоне int, как это делает практически на любой системе, с которой вы, вероятно, столкнетесь), и полученная сумма будет преобразована в float.

+0

"Предполагая, что char является подписанным типом" Что делать, если 'char' является неподписанным типом, что произойдет здесь:' (charVar + intVar2) '? – John

+0

@John: Обычно то же самое, на самом деле. Единственным случаем, когда происходит что-то другое, является то, что 'char' является неподписанным типом * и * его диапазон не соответствует диапазону' int'. ('int' требуется для поддержки, по крайней мере, диапазона шестнадцатиразрядного значения одного дополнения, а' char' должен быть размером байта, поэтому я думаю, что это возможно только в системе, где байты имеют 16 или больше бит. Итак, исчезающе редко. Я отрегулирую свой ответ, чтобы не подразумевать, что это более распространено, чем оно есть.) – ruakh

Смежные вопросы