Программирование на языке си ( с ) | C Sharp (Си шарп) с нуля. Сортировки | Массивы | Функции

Бинарные | Унарные ( инкрементация ) арифметические операции «Функция sizeof»

Практически ни одна программа на языке С/С++ не обходится без арифметических операций, поэтому эта тема крайне важна, так как тут не все просто. Не случайно с первого класса в школе вас уже заставляли слаживать яблоки или любые другие фрукты. Ну, начнем по порядку. Выделяют следующие виды операций:

   Бинарные операции

Операции Запись
Сложение a + b
Вычитание a - b
Деление a / b
Умножение a * b
Нахождение остатка a % b

Операции называются бинарными, если в них участвует два оператора. Вроде бы тут все понятно, но раз у нас в операции участвуют два операнда, то появляется интересная проблема:

А можно ли производить арифметические бинарные операции с разными типами данных? И если, да то что будет получаться на выходе операции?

И так, при выполнении различных бинарных операций, в которых участвуют данные одного типа, на выходе мы всегда будем получать данные этого же типа. Например:

int a = 4, b = 8;
printf ("%d",a+b); /* Функцию printf мы рассмотрим позже, пока вам надо знать, что она выводит значения на экран. В результате мы получим значение 12 int -ового типа */

Теперь давайте разберемся с бинарными арифметическими операциями переменных с разным типом данных. Для начала приведу тройку примеров, а после уже обобщу всю картину целиком:

#include <conio.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    int a = 5; // 2 байта
    float b = 3; // 4 байта
    double c = 2; // 8 байт
    char d = 'a'; // 1 байт

    printf ("%d\n",sizeof(a+b)); /* 4 байта, следовательно тип float */
    printf ("%d\n",sizeof(b+c)); /* 8 байт, следовательно тип double */
    printf ("%d\n",sizeof(a+d)); /* 2 байта, следовательно тип int */

    getch();
return 0;
}

   Функция sizeof

Функция sizeof возвращает количество байт, которые память выделяет под переменную. Из примера прекрасно видно, что при сложении переменных разных типов, при выходе получается переменная большего из типов. Да, по поводу типа char: символы, которые он хранит, имеют целочисленный код, поэтому при сложении ни каких проблем не возникает.

Еще остался один непонятный момент. Вроде б операции сложения, умножения, деления и вычитания все знают. А что же это за чудо такое - нахождение остатка? Лучше всего обратиться к примерам:

int a = 5, b = 2;
a = a % b; // Значение а будет равно 1

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

   Унарные операции

Их всего две:

  1. инкрементация:
  2. Увеличение числа на единицу.

    int i = 6;
    i++; // инкрементация
    i = i + 1; // эквивалентна инкрементации

  3. декриментация:
  4. Уменьшение числа на единицу.

    int i = 6;
    i--; // декрементация
    i = i - 1; // эквивалентна декрементации

Всегда, когда есть возможность использовать инкрементацию или декрементацию, то пользуйтесь ею, так как это увеличивает производительность вашей программы.

Но есть еще очень важный момент. Инкрементация и декрементация бывает префиксной и постфиксной:

int a = 5;
printf ("%d",++a); // Выведет 6
printf ("%d",a++); // Выведет 5

Следовательно, префиксная форма сначала увеличивает, а потом уже выполняет следующее действие, а постфиксная форма наоборот - сначала выполнит действия, а после увеличит значение.

На этом кончаем урок. Заданий не будет, так как, прочитав этот урок несколько раз, все должно быть предельно ясно.

Предвидущие уроки:

  1. Переменные

Следующие уроки:

  1. Функция printf
  2. Функция scanf и операции сравнения
  3. Первая программа на языке си ( с )
При копировании ( использовании ) материала размещайте ссылку на сайт www.mir-koda.ru