C равно: Операторы равенства: == и !=

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

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Операторы отношения и равенства сравнивают свои первые и вторые операнды для проверки истинности указанного отношения. Результат выражения отношения равен 1, если проверенное отношение истинно, или 0, если отношение ложно. Результат имеет тип int.

Синтаксис

relational-expression:
    shift-expression
    relational-expression<shift-expression
    relational-expression>shift-expression
    relational-expression<=shift-expression
    relational-expression>=shift-expression

equality-expression:
    relational-expression
    equality-expression==relational-expression


    equality-expression!=relational-expression

Операторы отношения и равенства проверяют следующие отношения.

ОператорПроверяемое отношение
<Первый операнд меньше второго операнда
>Первый операнд больше второго операнда
<=Первый операнд меньше или равен второму операнду
>=Первый операнд больше или равен второму операнду
==Первый операнд равен второму операнду
!=Первый операнд не равен второму операнду

Первые четыре оператора в приведенном выше списке имеют более высокий приоритет, чем операторы равенства (== и

!=). Сведения о приоритетах приведены в таблице Приоритет и ассоциативность операторов C.

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

  • Оба операнда любого оператора отношения или равенства могут быть указателями на один и тот же тип. Для операторов равенства (==) и неравенства (!=) результат сравнения показывает, указывают ли оба указателя на один и тот же адрес в памяти. Для других операторов отношения (<, >, <= и >=), результат сравнения показывает относительное положение двух адресов памяти для объектов, на которые указывают указатели. Операторы отношения сравнивают только смещения.

    Сравнение указателей определено только для частей одного и того же объекта. Если указатели относятся к элементам массива, сравнение аналогично сравнению соответствующих индексов. Адрес первого элемента массива «меньше» адреса последнего элемента. В случае структур указатели на те члены структуры, которые были объявлены позже, «больше» указателей на члены, объявленные в структуре ранее. Указатели на члены одного объединения эквивалентны.

  • Значение указателя можно сравнивать с постоянным значением 0 на равенство (==) или неравенство (!=). Указатель со значением 0 называется указателем «null»; иными словами, он не указывает на допустимое расположение в памяти.

  • В операторах равенства используются те же правила, что и для операторов отношения, но допускаются дополнительные возможности: указатель можно сравнить с постоянным целочисленным выражением, имеющим значение 0, или с указателем на

    void. Два указателя «null» при сравнении считаются равными. Операторы равенства сравнивают как сегмент, так и смещение.

Примеры

Ниже показаны примеры операторов отношения и равенства.

int x = 0, y = 0;
if ( x < y )

Поскольку x и y равны, выражение в этом примере возвращает значение 0.

char array[10];
char *p;
for ( p = array; p < &array[10]; p++ )
    *p = '\0';

Фрагмент в этом примере задает для каждого элемента массива array постоянное символьное значение null.

enum color { red, white, green } col;
   .
   .
   .
   if ( col == red )
   .
   .
   .

Эти операторы объявляют переменную перечисления с именем

col и тегом color. В любой момент времени эта переменная может содержать целочисленное значение 0, 1 или 2, которое представляет один из элементов перечисления color: красный, белый или зеленый цвет, соответственно. Если переменная col содержит значение 0 при выполнении оператора if , будут выполнены все операторы, зависящие от этого оператора if .

См. также

Операторы отношения: <, >, <= и >=
Операторы равенства: == и !=

Калькулятор емкости последовательного соединения конденсаторов • Электротехнические и радиотехнические калькуляторы • Онлайн-конвертеры единиц измерения

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

Пример. Рассчитать эквивалентную емкость двух соединенных последовательно конденсаторов 10 мкФ и 5 мкФ.

Входные данные

C1 фарад (Ф)микрофарад (мкФ)нанофарад (нФ)пикофарад (пФ)

C2 микрофарад (мкФ)

Добавить конденсатор

Поделиться

Поделиться ссылкой на этот калькулятор, включая входные параметры

Twitter Facebook Google+ VK

Закрыть

Выходные данные

Эквивалентная емкость

C микрофарад (мкФ)

Введите значения емкости в поля C1 и C 2, добавьте при необходимости новые поля, выберите единицы емкости (одинаковые для всех полей ввода) в фарадах (Ф), миллифарадах (мФ), микрофарадах (мкФ), пикофарадах (пФ), нанофарадах (нФ) и нажмите на кнопку Рассчитать.

1 мФ = 0,001 Ф. 1 мкФ = 0,000001 = 10⁻⁶ Ф. 1 нФ = 0,000000001 = 10⁻⁹ Ф. 1 пФ = 0,000000000001 = 10⁻¹² Ф.

В соответствии со вторым правилом Кирхгофа, падения напряжения V₁, V₂ and V₃ на каждом из конденсаторов в группе из трех соединенных последовательно конденсаторов в общем случае различные и общая разность потенциалов V равна их сумме:

По определению емкости и с учетом того, что заряд Q группы последовательно соединенных конденсаторов является общим для всех конденсаторов, эквивалентная емкость Ceq всех трех конденсаторов, соединенных последовательно, определяется как

или

Для группы из n соединенных последовательно конденсаторов эквивалентная емкость Ceq равна величине, обратной сумме величин, обратных емкостям отдельных конденсаторов:

или

Эта формула для Ceq и используется для расчетов в этом калькуляторе. Например, общая емкость соединенных последовательно трех конденсаторов емкостью 10, 15 and 20 мкФ будет равна 4,62 мкФ:

Если конденсаторов только два, то их общая емкость определяется по формуле

или

Если имеется n соединенных последовательно конденсаторов с емкостью C, их эквивалентная емкость равна

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

Отметим также, что общая емкость группы из любого количества последовательно соединенных конденсаторов всегда будет меньше, чем емкость самого маленького конденсатора, а добавление конденсаторов в группу всегда приводит к уменьшению емкости.

Конденсаторы на печатной плате

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

Выравнивающие резисторы уменьшают разброс напряжений на отдельных конденсаторах

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

Если несколько конденсаторов соединены параллельно, разность потенциалов V на группе конденсаторов равна разности потенциалов соединительных проводов группы. Общий заряд Q разделяется между конденсаторами и если их емкости различны, то заряды на отдельных конденсаторах Q₁, Q₂ and Q₃ тоже будут различными. Общий заряд определяется как

Конденсаторы, соединенные параллельно

По определению емкости, эквивалентная емкость группы конденсаторов равна

отсюда

или

Для группы n включенных параллельно конденсаторов

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

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

Конденсаторы на печатной плате

Автор статьи: Анатолий Золотков

оператор if — скорость сравнения C: равно «==» против побитового и «&»

спросил

Изменено 2 года, 11 месяцев назад

Просмотрено 653 раза

Предположим, у меня есть целое число, являющееся степенью числа 2, например. 1024:

 int a = 1 << 10; //работает с любой степенью числа 2.
 

Теперь я хочу проверить, совпадает ли другое целое число b с a . Что быстрее/лучше (особенно на слабых встроенных системах):

 if (b == a) {}
 

или

, если (б и а) {}
 

?

Извините, если это нубский вопрос, но не смог найти ответ с помощью поиска.

редактировать: спасибо за много проницательных ответов. Я мог бы выбрать только один из них, но все они приветствуются.

  • c
  • оператор if
  • побитовое и
  • оператор равенства

5

Эти операции даже не эквивалентны, потому что

a & b будет ложным , когда оба a и b равны 0 . Поэтому я бы предложил выразить семантику, которую вы хотите (например, a == b ), и позволить компилятору выполнить оптимизацию.

Если вы затем измерите , что у вас есть проблемы с производительностью в этот момент, тогда вы можете начать анализировать/оптимизировать...

6

Короткий ответ таков: это зависит от того, какие вещи вы сравниваете. Однако в этом случае я предполагаю, что вы сравниваете две переменные друг с другом (в отличие от переменной и непосредственной и т. д.)

Этот веб-сайт, хотя и довольно старый, изучал, сколько тактов выполнялось различными инструкциями. на платформе x86. Две инструкции, которые нас здесь интересуют, — это инструкция «И» и инструкция «CMP» (которую компилятор использует для & и == соответственно). Здесь мы видим, что обе эти инструкции занимают около 1/3 цикла, то есть вы можете выполнить 3 из них в среднем за 1 цикл. Сравните это с инструкцией "DIV", которая (в 1996) потребовалось 23 цикла для выполнения.

Однако здесь упущена одна важная деталь. Инструкции «И» недостаточно для завершения поведения, которое вы ищете. На самом деле, краткая компиляция на x86_64 предполагает, что вам нужны как инструкция «И», так и инструкция «ТЕСТ» для версии «&», тогда как «==» просто использует инструкцию «CMP». Поскольку все эти инструкции эквивалентны в IPC, "==" на самом деле будет немного быстрее... начиная с 1996 года. . Тем не менее, если вы хотите убедиться наверняка... просто напишите тестовую программу и убедитесь сами.

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

Ну... я думаю, что технически ноль НЕ ЯВЛЯЕТСЯ степенью двойки . 🙂 Как бы вы ни хотели его раскрутить, используйте "==".

ЦП X86 устанавливает флаг в зависимости от того, насколько результат любой операции сравнивается с нулем.

Для == ваш компилятор будет использовать либо специальную инструкцию сравнения, либо вычитание, установив этот флаг в обоих случаях. if() затем реализуется переходом, зависящим от этого бита.

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

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


Итог: пишите читаемый код и не пытайтесь микрооптимизировать то, что оптимизировать невозможно.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

C Операторы отношений и равенства

Редактировать

Твиттер LinkedIn Фейсбук Электронное письмо

  • Статья
  • 3 минуты на чтение

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

Syntax

relational-expression :
     shift-expression
     relational-expression < shift-expression
     relational-expression > shift-expression
     выражение-отношения <= выражение-сдвига
     relational-expression >= shift-expression

equality-expression :
     relational-expression
     equality-expression == relational-expression
     equality-expression != выражение-отношения

Операторы отношения и равенства проверяют следующие отношения:

Оператор Проверка отношений
< Первый операнд меньше второго операнда
> Первый операнд больше второго операнда
<= Первый операнд меньше или равен второму операнду
>= Первый операнд больше или равен второму операнду
== Первый операнд равен второму операнду
!= Первый операнд не равен второму операнду

Первые четыре оператора в приведенном выше списке имеют более высокий приоритет, чем операторы равенства ( == и != ). См. информацию о приоритете в таблице Приоритет и ассоциативность операторов C.

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

  • Оба операнда любого реляционного оператора или оператора равенства могут быть указателями на один и тот же тип. Для операторов равенства ( == ) и неравенства ( != ) результат сравнения указывает, обращаются ли два указателя к одной и той же ячейке памяти. Для других операторов отношения ( < , > , < = и > =) результат сравнения указывает относительное положение двух адресов памяти объектов, на которые указывает. Реляционные операторы сравнивают только смещения.

    Сравнение указателей определено только для частей одного и того же объекта. Если указатели ссылаются на элементы массива, сравнение эквивалентно сравнению соответствующих индексов. Адрес первого элемента массива "меньше" адреса последнего элемента. В случае структур указатели на элементы структуры, объявленные позже, являются указателями «больше, чем» на элементы, объявленные ранее в структуре. Указатели на члены одного и того же объединения равны.

  • Значение указателя можно сравнить с постоянным значением 0 на равенство ( == ) или неравенство ( != ). Указатель со значением 0 называется «нулевым» указателем; то есть он не указывает на допустимую ячейку памяти.

  • Операторы равенства подчиняются тем же правилам, что и операторы отношения, но допускают дополнительные возможности: указатель можно сравнить с постоянным целым выражением со значением 0 или с указателем на void . Если два указателя являются нулевыми указателями, они сравниваются как равные. Операторы равенства сравнивают сегмент и смещение.

Примеры

Приведенные ниже примеры иллюстрируют операторы отношения и равенства.

 int х = 0, у = 0;
если ( х < у )
 

Поскольку x и y равны, выражение в этом примере дает значение 0.

 char array[10];
символ *р;
for ( p = массив; p < &array[10]; p++ )
    *р = '\0';
 

Фрагмент в этом примере задает каждому элементу массива константу нулевого символа.

 enum color { красный, белый, зеленый } col;
   .
   .
   .
   если ( столбец == красный )
   .
   .
   .
 

Эти операторы объявляют переменную перечисления с именем col с тегом color . В любой момент переменная может содержать целочисленное значение 0, 1 или 2, которое представляет один из элементов перечисляемого набора цвета : красный, белый или зеленый цвет соответственно. Если col содержит 0, когда выполняется оператор if , будут выполняться любые операторы, зависящие от if .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *