Почему C # реализует операторы до / после увеличения / уменьшения для типов с плавающей запятой? - PullRequest
4 голосов
/ 15 января 2012

Что такого особенного в добавлении / вычитании 1 к / из значения с плавающей запятой, что оно заслуживает выделенного оператора?

double a = -0.001234129;
a++; // ? 

Я никогда не чувствовал необходимости использовать такую ​​конструкцию;это выглядит очень странно для меня.Но если бы мне пришлось когда-либо это сделать, я бы чувствовал себя гораздо комфортнее, если бы просто:

a += 1;

Может быть, это из-за моего сильного фона в C ++, но для меня это делает переменную похожей на индексатор массива.*

Есть ли причина для этого?

Ответы [ 2 ]

8 голосов
/ 15 января 2012

Операторы ++ и -- работают со всеми другими типами чисел, зачем делать исключения для чисел с плавающей запятой?Для меня это было бы более неожиданным выбором.


Обратите внимание, что C ++ также реализует их для плавающей запятой:

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    double a = 0.5;
    cout << a << '\n';
    ++a;
    cout << a << '\n';
    return 0;
}

Вывод:

0.5
1.5
2 голосов
/ 12 апреля 2012

Я предполагаю, что причина в согласованности с C / C ++.

Я согласен с вами, что это довольно странно - оператор '++' имеет особое значение для целочисленных значений:

  1. переводится в инструкцию по сборке INC,
  2. Это представляет изменение значения на специальную величину (то есть на наименьшую возможную сумму), и поэтому оно используется в итерациях.

Однако для чисел с плавающей запятой значение 1.0 не является каким-либо особым значением (с точки зрения машины). Вы также не должны использовать его для итераций (другими словами: если вы используете его, вы обычно должны подумать об использовании int), так как он не имеет назначенной инструкции сборки INC.

...