Является ли const двойной приведением во время компиляции? - PullRequest
1 голос
/ 02 февраля 2012

Имеет смысл определять математические константы как двойные значения, но что происходит, когда требуется использовать значения с плавающей точкой вместо двойных? Компилятор автоматически интерпретирует двойники как числа с плавающей точкой во время компиляции (таким образом, они фактически обрабатываются, как они были константами с плавающей точкой), или это преобразование выполняется во время выполнения?

1 Ответ

2 голосов
/ 02 февраля 2012

Если под «определением» вы подразумеваете использование #define, вот что происходит:

Скажем, у вас есть:

#define CONST1 1.5
#define CONST2 1.12312455431461363145134614  // Assume some number too
                                             // precise for float

Теперь, если у вас есть:

float x = CONST1;
float y = CONST2;

вы не получите никакого предупреждения для x, потому что компилятор автоматически делает CONST1 a float.Для y вы получаете предупреждение, потому что CONST2 не помещается в float, , но компилятор в любом случае преобразует его в float.


Еслипод «определением» вы подразумеваете использование const переменных, вот что происходит:

Скажем, у вас есть

const double CONST1=1.5;
const double CONST2=1.12312455431461363145134614; // Assume some number too
                                                  // precise for float

Теперь, если у вас есть:

float x = CONST1;
float y = CONST2;

тамКомпилятор не может знать значения CONST1 и CONST2 (*) и поэтому не может интерпретировать значения как float при их компиляции.Вам будет выдано два предупреждения о возможной потере данных, и преобразование будет выполнено во время выполнения.

(*) На самом деле есть способ.Поскольку значения const, оптимизатор может принять решение не принимать для них переменную, а заменить значения во всем коде.Это может усложниться, поскольку вы можете передать адрес этим переменным, так что оптимизатор может решить не делать этого.То есть не рассчитывайте на это.


Обратите внимание, что все это верно для любых базовых преобразований типов.Если у вас есть

#define CONST3 1

, то вы думаете, что CONST3 равно int, но если вы положите его в float, оно станет float во время компиляции или если вы положите егов char он станет char во время компиляции.

...