Если у меня есть выражение, подобное следующему:
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
?
Порядок операций применяется. /
а также *
а также +
все левоассоциативны, и /
а также *
имеют равный приоритет (который больше, чем у +
) так вот:
double b = floatVar / intVar * shortVar + charVar + intVar2;
эквивалентно этому:
double b = (((floatVar / intVar) * shortVar) + charVar) + intVar2;
На каждом шаге выполняются соответствующие преобразования: intVar
преобразуется в float
, shortVar
преобразуется в float
, charVar
преобразуется в float
, intVar2
преобразуется в float
, Конечный результат повышен до double
,
Если, с другой стороны, вы должны были обернуть charVar + intVar2
в скобках, чтобы сначала выполнить эту операцию, затем charVar
будет повышен до int
(при условии, что диапазон char
вписывается в диапазон int
, как это происходит почти в любой системе, с которой вы, вероятно, столкнетесь), и полученная сумма будет преобразована в float
,