Как работает логическое отрицание в C? - PullRequest
11 голосов
/ 23 февраля 2010

Я использую! (логическое отрицание) в C и на других языках, мне интересно, кто-нибудь знает, как сделать свой собственный! функционировать? или есть творческий способ сделать один?

Ответы [ 5 ]

20 голосов
/ 23 февраля 2010
int my_negate(int x)
{
    return x == 0 ? 1 : 0;
}
7 голосов
/ 23 февраля 2010

!e можно заменить на ((e)?0:1)

5 голосов
/ 23 февраля 2010

Помните оператор взрыва '!' или восклицательный знак на английском языке, встроенный в язык программирования как средство отрицания.

Рассмотрим пример троичного оператора:

(some condition) ? true : false;

Теперь, если бы это было отменено, троичный оператор был бы таким

(some condition) ? false : true;

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

if (strcmp(foo, "foo")){

}

Когда это действительно должно быть:

if (!strcmp(foo, "foo")){
}

Обычно, когда вы отрицаете, все наоборот, как показано в примере с троичным оператором ...

Надеюсь, это поможет.

3 голосов
/ 23 февраля 2010

C считает все ненулевые значения "истиной" и ноль "ложными". Логическое отрицание осуществляется путем проверки на ноль. Если вход точно равен нулю, выведите ненулевое значение; в противном случае выведите ноль. В коде вы можете написать это как (input == 0) ? 1 : 0 (или вы можете преобразовать его в оператор if).

Когда вы спрашиваете, как «создать свой собственный метод!», Вы имеете в виду, что хотите написать функцию, которая отрицает логическое значение, или вы хотите определить, что делает оператор восклицательного знака? Если первое, то заявления, которое я разместил выше, должно быть достаточно. Если последнее, то я боюсь, что это не может быть сделано в C. C ++ поддерживает перегрузку операторов, и если это строго необходимо, я бы посоветовал поискать там.

0 голосов
/ 23 февраля 2010

Если вы хотите перегрузить оператор, правильный прототип:

bool operator!();

Я не большой поклонник перегрузок операторов, но некоторым людям нравится их синтаксический сахар. РЕДАКТИРОВАТЬ: Это только C ++! Поместите это в определение вашего класса.

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