Неявное приведение типов от double до int? - PullRequest
2 голосов
/ 13 апреля 2019
// Assuming these initializations
int x; 
float y;

В чем разница между этим:

  x = y = 7.5;

и этим:

  y = x = 7.5;

Как получается, что первый печатает значение y как 7.5, ивторой печатает y как 7.00?

Ответы [ 3 ]

8 голосов
/ 13 апреля 2019

Объяснение очень простое: = является ассоциативным справа налево, что означает, что x = y = 7.5; оценивается как x = (y = 7.5);, следовательно, по существу, такое же как:

y = 7.5;   // value is converted from double to float, y receives 7.5F
x = y;     // value of y is converted from float to int, x receives 7 (truncated toward 0)

, тогда как y = x = 7.5; оцениваетсяas y = (x = 7.5);:

x = 7.5;   // 7.5 is converted to int, x receives value 7 (truncated toward 0)
y = x;     // value of x is converted to float, y receives 7.0F

Эти неявные преобразования могут быть противоречивыми.Возможно, вы захотите повысить уровень предупреждения, чтобы компилятор предупреждал вас о потенциальных ошибках и нежелательных побочных эффектах.

4 голосов
/ 13 апреля 2019

Цепочка назначений, как вы показываете, оценивается справа налево.

x = y = 7.5;

совпадает с

x = (y = 7.5);

Кроме того, результатом присвоения является присвоенное значение.Это означает, что 7.5 (тип double) косвенно приводится к float, а затем присваивается y.Результат (7.5f) затем присваивается x.Во время этого присваивания значение преобразуется в int, а в результате получается 7, который сохраняется в x.

Если вы переключаете ордер, вы получаете различные типы:

y = x = 7.5;

Теперь 7.5 (тип double) косвенно приводится к int, а затем присваивается x.Результат 7, который присваивается y.Теперь это значение приведено к double, но дробь уже потеряна, и вы получите 7.0f, хранящиеся в y.

2 голосов
/ 13 апреля 2019

во втором выражении

y = x = 7.5; /* multiple assignment operator. R->L associativity */

x = 7.5 вычисляется первым, и вы присваиваете реальное плавающее значение 7.5 целому числу x, которое приводит к усечению дробной части, поэтому x присваивается значение 7 вместо 7.5 и позже на y назначается 7.00000

Из раздела C99 Standard 6.3.1.4. Действительное и целое

Когда конечное значение реального плавающего типа преобразуется в целочисленный тип , отличный от _Bool, дробная часть отбрасывается (т.е. значение усекается до нуля). Если значение неотъемлемой части не может быть представлена ​​целочисленным типом , поведение undefined .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...