четверг, 27 февраля 2014 г.

Арифметические операторы

Бинарными (т. е. с двумя операндами) арифметическими операторами являются +, -, *, /, а также оператор деления по модулю %.

Деление целых сопровождается отбрасыванием дробной части.

#include <stdio.h>
int main(void)
{
    int a = 17;
    int b = 3;
    float c = 0;
    c = a / b;
    printf("%f\n", c);

    return 0;
}
$ ./a.out
5.000000

Тогда как 17 / 3 = 5,6666666666666666666666666666667

Картина меняется, если одну из переменных (либо float a = 17, либо float b = 3) опредлеить как float. Тогда
$ ./a.out
5.666667

Выражение x % y дает остаток от деления x на y и 0 (нуль), если x делится на y нацело.

Например, год является високосным, если он делится на 4, но не делится на 100. Кроме того, год является високосным, если он делится на 400.

#include <stdio.h>
int main(void)
{
    int year;
    for (year = 2004; year <= 2014; ++year)
    {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
            printf("%d високосный год\n", year);
        else
            printf("%d невисокосный год\n", year);
    }
    return 0;

}

Оператор % к операндам типов float и double не применяется.

1. #include <stdio.h>
2. int main(void)
3. {
4.     printf("17.0 % 5.0 = %d\n", 17.0 % 5.0);
5.     return 0;
6. }

test.c: In function 'main':

test.c:4:38: error: invalid operands to binary % (have 'double' and 'double')

В какую сторону (в сторону увеличения или уменьшения числа) будет усечена дробная часть при выполнении / зависит от машины.
В моем случае, в сторону уменьшения.

Каким будет знак результата операции % с отрицательными операндами, так же, зависит от машины. В моем случае знак "-".

#include <stdio.h>
int main(void)
{
    signed int x = -8;
    signed int y = -5;
    printf("-8 %% -5 = %d\n", x % y);

    return 0;
}
$ ./a.out
-8 % -5 = -3

Бинарные операторы + и - имеют одинаковый приоритет, который ниже приоритета операторов *, / и %, который в свою очередь ниже приоритета унарных операторов + и -. Арифметические операции одного приоритетного уровня выполняются слева направо.

Комментариев нет:

Отправить комментарий