Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Язык си обозначения

Операции в языке Си

Над объектами в языке Си могут выполняться различные операции:

  • операции присваивания;
  • операции отношения;
  • арифметические;
  • логические;
  • сдвиговые операции.

Результатом выполнения операции является число.

Операции могут быть бинарными или унарными.
Бинарные операции выполняются над двумя объектами, унарные — над одним.

Операция присваивания

Операция присваивания обозначается символом = и выполняется в 2 этапа:

  • вычисляется выражение в правой части;
  • результат присваивается операнду, стоящему в левой части:

объект = выражение;

В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.
объект = (тип)выражение;

Операции отношения

Основные операции отношения:

  • == эквивалентно — проверка на равенство;
  • != не равно — проверка на неравенство;
  • меньше;
  • > больше;
  • меньше или равно;
  • >= больше или равно.

Операции отношения используются при организации условий и ветвлений. Результатом этих операций является 1 бит, значение которого равно 1 , если результат выполнения операции — истина, и равно 0 , если результат выполнения операции — ложь.

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

Основные бинарные операции, расположенные в порядке уменьшения приоритета:

  • * — умножение;
  • / — деление;
  • + — сложение;
  • — вычитание;
  • % — остаток от целочисленного деления.

Основные унарные операции:

  • ++ — инкрементирование (увеличение на 1);
  • –– — декрементирование (уменьшение на 1);
  • — изменение знака.

Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него). Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций. Если операция ++ или расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на 1.

Бинарные арифметические операции могут быть объединены с операцией присваивания:

  • объект *= выражение; // объект = объект * выражение
  • объект /= выражение; // объект = объект / выражение
  • объект += выражение; // объект = объект + выражение
  • объект -= выражение; // объект = объект — выражение
  • объект %= выражение; // объект = объект % выражение

Логические операции

Логические операции делятся на две группы:

Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:

  • 1 если выражение истинно;
  • 0 если выражение ложно.

Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.

Основные условные логические операции:

  • && — И (бинарная) — требуется одновременное выполнение всех операций отношения;
  • || — ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;
  • ! — НЕ (унарная) — требуется невыполнение операции отношения.

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

Основные побитовые логические операции в языке Си:

инверсия (логическое НЕ) — унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;

  • ^ исключающее ИЛИ — бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).
  • Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.

    a

    aba & ba | ba ^ b
    1
    1111
    111
    1111

    a; // e = 241 = 1111 0001
    f = a ^ b; // f = 7 = 0000 0111

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

    БитМаска
    0x01
    10x02
    20x04
    30x08
    40x10
    50x20
    60x40
    70x80

    Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:

    Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:

    0x02); // a = 1, бит 1 сброшен

    Бинарные побитовые логические операции могут быть объединены с операцией присваивания:

    • объект &= выражение; // объект = объект & выражение
    • объект |= выражение; // объект = объект | выражение
    • объект ^= выражение; // объект = объект ^ выражение

    Сдвиговые операции

    Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:

    • >> — сдвиг вправо;
    • — сдвиг влево.

    Общий синтаксис осуществления операции сдвига:
    объект = выражение сдвиг КоличествоРазрядов;

    Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2.
    Арифметический сдвиг целого числа влево на 1 разряд соответствует умножению числа на 2.

    Комментариев к записи: 25

    ddd; if(ddd==0). то ИФ не реагирует на этот ноль, видно стало ddd = 11111110, а это не ноль. А когда написал : char ddd = 0; . . ddd =

    ddd; if(ddd). ИФ отреагировал. Что изменилось?

    C++ — Операторы

    Оператор — это символ, который сообщает компилятору выполнить определенные математические или логические манипуляции. C ++ богат встроенными операторами и предоставляет следующие типы операторов:

    • Арифметические операторы
    • Реляционные операторы
    • Логические операторы
    • Побитовые операторы
    • Операторы присваивания
    • Другие операторы

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

    Существуют следующие арифметические операторы, поддерживаемые языком C ++:

    ОператорОписаниеПример
    +Добавляет два операндаA + B даст 30
    Вычитает второй операнд с первогоA — B даст -10
    *Умножает оба операндаA * B даст 200
    /Делит числитель на де-числительB / A даст 2
    %Оператор модуля и остаток после целочисленного деленияB% A даст 0
    ++Оператор приращения увеличивает целочисленное значение на единицуA ++ даст 11
    Уменьшает целочисленное значение на единицуA— даст 9

    Реляционные операторы

    Существуют следующие реляционные операторы, поддерживаемые языком C ++:

    ОператорОписаниеПример
    ==Проверяет, равны ли значения двух операндов или нет, если да, то условие становится истинным.(A == B) не соответствует действительности.
    знак равноПроверяет, равны ли значения двух операндов или нет, если значения не равны, условие становится истинным.(A! = B) истинно.
    >Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным.(A> B) неверно.
    =Проверяет, превышает ли значение левого операнда значение правого операнда, если да, тогда условие становится истинным.(A> = B) неверно.
    >Двоичный оператор правого сдвига. Значение левых операндов перемещается вправо на количество бит, заданных правым операндом.A >> 2 даст 15, что составляет 0000 1111

    Операторы присваивания

    Существуют следующие операторы присваивания, поддерживаемые языком C ++:

    ОператорОписаниеПример
    знак равноПростой оператор присваивания, присваивает значения из правых операндов в левый операнд.C = A + B присваивает значение A + B в C
    + =Оператор Add AND присваивания, Он добавляет правый операнд в левый операнд и присваивает результат левому операнду.C + = A эквивалентно C = C + A
    знак равноSubtract AND assign operator, вычитает правый операнд из левого операнда и присваивает результат левому операнду.C — = A эквивалентно C = C — A
    знак равноОператор умножения и присваивания, Он умножает правый операнд на левый операнд и присваивает результат левому операнду.C * = A эквивалентно C = C * A
    знак равноОператор Divide AND assign. Он делит левый операнд на правый операнд и присваивает результат левому операнду.C / = A эквивалентно C = C / A
    знак равноМодуль и оператор присваивания, он принимает модуль с использованием двух операндов и присваивает результат левому операнду.C% = A эквивалентно C = C% A
    > =Оператор правой смещения и назначения.C >> = 2 совпадает с C = C >> 2
    знак равноПобитовый И оператор присваивания.C & = 2 является таким же, как C = C & 2
    ^ =Побитовое исключающее ИЛИ и оператор присваивания.C ^ = 2 является таким же, как C = C ^ 2
    | =Побитовое включение оператора OR и присваивания.C | = 2 совпадает с C = C |2

    Другие операторы

    В следующей таблице перечислены некоторые другие операторы, поддерживаемые C ++:

    Возвращает размер переменной. Например, sizeof (a), где ‘a’ является целым числом и будет возвращать 4.

    Если Условие истинно, то оно возвращает значение X, иначе возвращает значение Y.

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

    Используются для ссылки на отдельных членов классов, структур и союзов.

    Преобразуют один тип данных в другой. Например, int (2.2000) вернет 2.

    Возвращает адрес переменной. Например, & a; даст фактический адрес переменной.

    Является указателем на переменную. Например * var; будет указывать на переменную var.

    Приоритеты операторов в C ++

    Приоритет оператора определяет группировку терминов в выражении. Это влияет на оценку выражения. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения —

    Например, x = 7 + 3 * 2; здесь x назначается 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем добавляется в 7.

    Здесь операторы с наивысшим приоритетом появляются в верхней части таблицы, а нижние — внизу. Внутри выражения сначала будут оцениваться операторы с более высоким приоритетом.

    Краткий справочник по языку Си

    Начнём с комментариев…

    // Однострочный комментарий

    /*
    Многострочный комментарий
    */

    Булевые типы

    true — верно
    false — не верно

    Подключение файлов с помощью #include

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

    Функции

    Объявление функций должно происходить в .h-файлах или в начале .c-файла.

    Точка входа в программу – это функция main(). Работа программы начинается с неё, вне зависимости от места расположения в коде.

    Для вывода в консоль используется printf

    %d – означает, что будем выводить целое число

    n переводит указатель на новую строчку

    int обычно имеет длину 4 байта

    short имеет длину 2 байта

    char имеет длину 1 байт

    Одиночные символы заключаются в одинарные кавычки

    long как правило занимает от 4 до 8 байт
    long long занимает как минимум 64 бита

    float это 32-битное число с плавающей точкой (дробное число)

    double это 64-битное число с плавающей точкой

    Целые типы могут быть беззнаковыми

    sizeof(T) возвращает размер переменной типа Т в байтах
    sizeof(object) возвращает размер объекта object в байтах.

    Если аргуметом sizeof будет выражение, то этот аргумент вычисляется во время компиляции кода (кроме динамических массивов)

    size_t это беззнаковый целый тип который использует как минимум 2 байта для записи размера объекта

    Выведет строку «sizeof(a++) = 4, где a = 1» (на 32-битной архитектуре)

    Можно задать размер массива при объявлении

    Можно обнулить массив при объявлении

    Индексация массива происходит также как и в других Си-подобных языках

    Массивы изменяемы, как и другие переменные

    Массив может быть объявлен динамически, размер не обязательно рассчитывать при компиляции

    Вывод программы (в зависимости от архитектуры) будет таким:

    Строка – это просто массив символов, оканчивающийся нулевым (NUL (0x00)) байтом, представляемым в строке специальным символом ‘’. Его не нужно вставлять в строку, компилятор всё сделает сам.

    %s — означает, что будем выводить строку

    напечатает 0
    17, 18, 19 и 20-ый байты, тоже будут равны нулю

    Если между одинарными кавычками есть символ – это символьный литерал, но это тип int, а не char (по историческим причинам).

    Операторы

    Переменные можно объявлять через запятую

    == — равно
    != — не равно (символ ! — отрицание, применяется в разных конструкциях)
    >, = — больше или равно

    В Си, нет булевого типа, вместо него используется int. 0 это false, всё остальное это true.

    ! — отрицание
    && — логическое И
    || — логическое ИЛИ

    Структуры ветвления

    if — если
    else if — иначе если
    else — иначе

    Цикл с предусловием

    while — выполняется пока выражение не примет значение false

    Цикл с постусловием

    do while — код выполнится хотя бы один раз

    Условие проверяется в конце цикла, а не в начале, так что код в теле цикла будет выполнен по крайней мере один раз.

    Цикл со счётчиком

    for — Цикл будет работать до тех пор, пока i

    Форматирование вывода

    Каждое выражение в Си имеет тип, но можно привести один тип к другому.

    Целые типы могут быть приведены к вещественным и наоборот.

    Указатели

    Для того чтобы объявить указатель, который будет ссылаться на переменную, необходимо сначала получить адрес этой переменной. Чтобы получить адрес памяти переменной (её расположение в памяти), нужно использовать знак & перед именем переменной. Это позволяет узнать адрес ячейки памяти, в которой хранится значение переменной. Эта операция называется — операция взятия адреса и выглядит вот так:

    В третьей строке использовалась операция взятия адреса, мы взяли адрес переменной var и присвоили его указателю ptrVar.

    Рассмотрим программу, которая наглядно покажет всю мощь указателей:

    Указатель – это переменная которая хранит адрес в памяти.
    При объявлении указателя указывается тип данных переменной на которую он будет ссылаться.
    Можно получить адрес любой переменной, а потом работать с ним.

    Используйте & для получения адреса переменной.

    Для объявления указателя нужно поставить * перед именем.

    Для того, чтобы получить знаечние по адресу, напечатайте * перед именем.

    Вы также можете изменять значение, на которое указывает указатель.

    Массивы

    Используются для большого количества однотипных данных.

    Строки это массивы символов, но обычно они представляются как указатели на первый элемент массива.
    Хорошей практикой считается использование `const char *’ при объявлении строчного литерала. При таком подходе литерал не может быть изменён.

    Функции

    Синтаксис объявления функции:
    (аргументы)

    Приставка void означает, что функция ничего не возвращает

    Типы и структуры определяемые пользователем

    typedef — используется для задания стандартным типам своих названий

    Структуры — это просто коллекция данных, память для которых выделяется последовательно.

    sizeof(struct rectangle) == sizeof(int) + sizeof(int) – не всегда верно из-за особенностей компиляции.

    Можно применить typedef к структуре, для удобства.

    Если структура большая, то (чтоб не копировать) её можно получить «по указателю».

    Указатели на функции

    Во время исполнения, функции располагаются по известным адресам в памяти.
    Указатель на функцию может быть использован для непосредственного вызова функции.
    Однако синтаксис может сбивать с толку.

    Пример использования str_reverse по указателю

    Первая программа на Си — «Hello World»

    Создать в любом текстовом редакторе файл hello world.c

    Всё выше описаное, можно смело применять в программировании Arduino.

    Логические операторы в си

    Логические операторы

    Л огические операторы – это операторы, которые принимают в качестве аргументов логические значений (ложь или истину) и возвращают логическое значение. Как и обычные операторы, они могут быть одноместными (унарными, т.е. принимать один аргумент), двуместными (бинарные, принимают два аргумента), трёхместными и т.д.

    Особенностью языка си является то, что в нём нет типа, хранящего булево значение (ложь или истину). В си ложью (логическим нулём) считается целочисленный 0, а любое ненулевое целое будет логической истиной. Например

    Логические значения обычно порождаются операторами сравнения (==, !=, >, =. О ператор НЕ (NOT) используется для того, чтобы инвертировать значение аргумента. Т.е., если ему передали истину, то он вернёт ложь, если получил ложь в качестве аргумента, то вернёт истину.

    ОператорОписание
    sizeof
    Condition ? X : Y
    ,
    . (dot) and -> (arrow)
    Cast
    &
    *
    Логический оператор НЕ

    XNOT X
    1
    1

    В си отрицание представлено оператором !. Например

    Как и в обычной логике, здесь действует закон двойного отрицания – отрицание отрицания можно опустить.

    Логическое И

    О ператор И (AND, логическое умножение) возвращает истину тогда и только тогда, когда оба аргумента являются истиной.

    Логический оператор И

    XYX AND Y
    1
    1
    111

    В си логическое умножение представлено оператором &&. Например, задача – в кружок военных спейсмаринов допускаются только совершеннолетние граждане мужского пола. То есть, претендентом может стать только тот, для которого одновременно два условия являются истиной

    Оператор И может применяться последовательно к нескольким аргументам. Для него действует ассоциативный и коммутативный законы. Усовершенствуем программу, будем также вводить рост:

    Также условие могло быть записано

    Логическое ИЛИ

    О ператор логическое ИЛИ (логическое сложение, OR) истинен тогда, когда истиной является хотя бы один его аргумент.

    Логический оператор ИЛИ

    XYX OR Y
    11
    11
    111

    В си ИЛИ представлен оператором ||. Например, усовершенствуем программу: теперь пол можно вводить как большой, так и маленькой буквой

    Как и в случае оператора И, ИЛИ коммутативен и ассоциативен.

    Операторы можно перемешивать друг с другом, создавая сложные операторы

    Стоит только помнить о том, что оператор отрицания имеет больший приоритет, чем И или ИЛИ, поэтому будет выполняться в первую очередь. Если может случиться ситуация, когда порядок выполнения не ясен, определите его с помощью скобок.

    Пример: закон де-Моргана. Чтобы сменить И на ИЛИ (или наоборот), необходимо инвертировать значения всех операндов, заменить И на ИЛИ (или ИЛИ на И) и инвертировать конечный результат. В случае с нашим условием

    Рассмотрим сначала кусок

    Меняем все значения на обратные

    заменяем оператор && на ||

    и инвертируем ответ

    Как видим, результат тот же. Очевидно, что

    Таким образом, изменим условие

    Поменяем таким же образом вторую скобку

    Теперь можно применить это же правило и для всего выражения

    Порядок выполнения логических операторов

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

    где a, b, c, d – логические значения. Всё выражение равно истине тогда и только тогда, когда все операнды истинны. Если хотя бы один из операндов ложь, то остальные уже не важны. Поэтому, для оптимизации работы, вычисление происходит слева направо и останавливается, как только был найден первый операнд, равный нулю.

    В си оператор присваивания может возвращать значение. Иногда он используется непосредственно в условии:

    В данном случае, оператор malloc не будет выполнен, так как первый операнд a равен 0 (соответственно, всё выражение равно нулю). Таким образом, оператор free попытается очистить память, которую не может очистить (т.к. p продолжит ссылаться на a). Если же мы поменяем a = 1, то всё отработает без проблем.

    То же самое происходит и при выполнение ||. Выражение

    выполняется слева направо до тех пор, пока не встретит первое ненулевое значение. После этого выполнение останавливается, так как известно, что всё выражение равно истине.

    Очевидно, что это касается не только оператора присваивания, но и любого другого вызова функции. Например, в этом случае функции foo будет вызвана, bar нет.

    Вывод – не используйте присваивания и вызовов функций (особенно, если они изменяют состояние программы) внутри условий.

    Читать еще:  Ошибка ожидание скачивания в плей маркете
    Ссылка на основную публикацию
    Adblock
    detector