Я работаю над книгой по С++, чтобы научить себя. В книге, над которой я работаю, рассказывается об сужении с помощью преобразования типов. В нем объясняется, как число double может быть сужено до int, и говорится: «Что делать, если вы считаете, что преобразование может привести к неверным значениям?» Используйте инициализаторы {}, чтобы избежать несчастных случаев. Затем он дает очень ограниченный пример кода и имеет мало контекста:
double x{ 2.7 }; // OK
int y(x); //error:double -> int might narrow
Я попытался запустить некоторый код, чтобы увидеть, как он работает, но мои результаты оказались не такими, как я ожидал:
double test {1.2};
cout << "First Line test = " << test << '\n';
test = 3 / 2;
cout << "Test = " << test << '\n';
Из того, что я прочитал, у меня сложилось впечатление, что если бы я инициализировал double test
версией {}
, а не версией =
, я бы предотвратил возможность последующего сужения переменной test
до int
.
Разве это не так?
Я прочитал упомянутое здесь и здесь о целочисленном делении, но мне это все еще не ясно.
Если бы я работал на C, я бы использовал приведение типов:
double test = 0.0;
test = (double)3/2;
printf("test = %f", test);
У меня сложилось впечатление, что если бы я сделал это на C++, то получилось бы то же самое:
double test {1.2};
test = 3 / 2;
1.2
, но не значение1.0
, в зависимости от того, как она была первоначально инициализирована? Или вы говорите, что считаете, что результат выражения3/2
должен зависеть от того, как этот результат будет использоваться позже? Я пытаюсь понять, где кроется недоразумение, какая часть этого примера вам непонятна. - person Igor Tandetnik   schedule 01.03.20213/2
является значение1
типаint
(независимо от того, что произойдет с этим значением дальше) в соответствии с правилами целочисленного деления. Когда это значение присваивается переменнойdouble
, оно преобразуется вdouble
и становится1.0
. Следовательно, после присваиванияtest = 3/2;
переменнаяtest
содержит значение1.0
типаdouble
. Надеюсь это поможет. - person Igor Tandetnik   schedule 01.03.20213/2
является целое число 1, независимо от того, будет ли это значение позднее присвоено переменной типа double, переменной типа int, напечатано или просто отброшено.(double)3/2
работает, потому что литерал3
преобразуется вdouble
перед делением; это эквивалентно3.0/2
. Опять же, это не имеет ничего общего с переменной в левой части присваивания. - person Igor Tandetnik   schedule 01.03.20213/1
является1
. Это не зависит от того, помещено ли оно в фигурные скобки, в круглые скобки, в квадратные скобки или без фигурных скобок. - person n. 1.8e9-where's-my-share m.   schedule 08.03.2021