2013-03-25 2 views
5

В настоящее время вы просматриваете C++, используя this tutorial. Он объясняет, что такое оператор ! NOT, но я не думаю, что полностью понимаю, почему я когда-либо хотел его использовать. Может кто-нибудь объяснить?В чем смысл оператора NOT?

+5

Я был бы очень заинтересован в том, как бы вы тогда выражали 'if (! X)' без него ... – PlasmaHH

+6

@PlasmaHH: 'if (static_cast (x) == false)', * очевидно *. – Fanael

+2

, очевидно, модная вещь, которую нужно сделать, это если (x) {тогда ничего не делать} else {do ​​something}. –

ответ

1

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

#include <iostream> 
    using namespace std; 
    int main() 
    { 
    int a,b,c,sum; 
    cin >> a >> b >> c; 
    sum = a+b; 
    if (c!=0) //which is equivalent to if(!c) 
    cout << sum/c; 
    } 

Я использовал простой пример, чтобы быстро его понять. Теперь все в порядке? С уважением и удачи в учебе.

+2

Я не думаю, что это очень хороший пример.'! =', конечно, не то же самое, что и '!', а использование '!' как сокращенного способа сравнения с нолем не является идеальным. – Pubby

+1

Я знаю, но он только начал изучать С ++, и я просто хотел дать ему ключ к этому типу оператора. Когда он станет «большим мальчиком», он поймет, что я глупый новичок, и мой ответ отстой. Пока, хорошо держать его коротким и простым. –

13

Оператор ! полезен, если вы хотите проверить, что условие в настоящее время не выполнено.

Представьте себе функцию, которая говорит вам, если конкретная подсистема приложения инициализации и другая функция для инициализации:

bool subsystem_is_initialized(); 
void subsystem_initialize(); 

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

if (!subsystem_is_initialized()) 
    subsystem_initialize(); 

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

Также имейте в виду, что, как и почти все другие операторы на С ++, он может быть перегружен классами.

+0

Не говоря уже о том, что это бесконечно читаемо, чем в явном сопоставлении с 0. – svidgen

+0

Вы также можете «удвоить отрицание», чтобы сделать что-то буквальным булевым. '!!' - это шаблон, часто встречающийся в динамически типизированных языках, где он сначала отличает 'true' или' false', а затем инвертируется. Это реже встречается в C++, где 'return foo' автоматически переходит к соответствующему типу возврата. – tadman

2

! Оператор используется для отрицания в условиях проверки состояния bool. Есть много мест, где вы можете его использовать. Простой пример:

if (!existInArray(A, i)) 

проверить, если i НЕ существует в массиве.

5

Язык не всегда (на самом деле так хорош, как никогда), который имеет минимальный набор функций, но набор полезных функций. Например, если вы имели следующий код:

if (!test_something()) 
    do_something(); 

Вы могли бы также выразить это как

if (test_something()) { 
} else 
    do_something(); 

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

+0

Пустое предложение 'if' является беспорядочным и его следует избегать. Похоже, вы намеревались что-то там положить и забыли сделать это. – tadman

+0

@ tadman: Это в основном моя точка зрения. Это законно, но уродливо, так что хорошо, что вы можете использовать '!'. – bitmask

2

! или оператор NOT является логическим эквивалентом ворот NOT.

Итак, в таблице правды ворот NOT говорится, что если верно x, то !x является ложным. и наоборот.

Не слишком сложно, если вы думаете об этом логически. Например, НЕ мужчины - это женщина, НЕ истинная ложь, НЕ простая сложна.

+0

Вот некоторые довольно ужасные примеры. Пол - это не двоичная вещь. – tadman

+0

@ tadman даже трансгендеры хотели бы классифицировать себя в той или иной категории. Это был просто пример :-) –

+0

«НЕ» не означает противоположности. – Pubby

5

Используется, когда вам нужно перевернуть истину/ложь в состоянии, чтобы повысить читаемость. , например. Сравнить

// Ensure that the thing is NOT red. 
if (thing_is_red() == false) 
    ... 
if (!thing_is_red()) 
    ... 
+0

Это также намного лучше, чем строгое утверждение против 'NULL', как в' if (pointer! = NULL) 'versus' if (pointer) 'или' if (pointer == NULL) 'as' if (! Pointer) '. – tadman

+0

@tadman Это будет зависеть от используемого стиля кодирования. Лично я использую '!' Для переключения условий, где я сравниваю true или false. Я считаю, что замена явных сравнений на NULL или другие значения данных требует слишком большого знания конкретных особенностей любого языка, который вы используете. True/false существуют за пределами компьютеров, в традиционной логике, которые нужны всем * программистам *, независимо от используемого языка программирования. –

+0

Если вы не знаете «особые причуды» на C++, вероятно, вам не нужно программировать на C++, так как не зная, как правильно использовать бензопилу, вы не должны ее использовать. Прощение - это не термин, который можно было бы использовать для описания C++. – tadman

2

tutorial you mention:

НЕ: Оператор НЕ принимает один входной сигнал. Если этот вход TRUE, он возвращает FALSE, и если этот вход FALSE, он возвращает TRUE.

это означает, что оператор НЕ является унарный оператор означает один операнд (не бинарный оператор)

как && and || `являются бинарными операторами и там синтаксис:

result = operand1 && operand2 
    result = operand1 || operand2 

Унарное является:

result = !operand1 

и его значения результата возвращают значение операнда id operand1 = True, затем результат w ould be False, и если результат operand1 = False является True.

же там написано:

Например, НЕ (1) принимает значение 0, а НЕ (0) оценивает 1. NOT (любое число, но ноль) принимает значение 0. В C и C++ НЕ написано как!. NOT оценивается до AND и OR.

в C/C++ 0 является Ложные и Non 0 эквивалентно True.

есть пара хороших примеров!

(1).

!(1 || 0) 

Мы знаем 1 || 0 это 1 означает истинный и применение NOT оператора делает его 0 означает Ложный:

!(1 || 0) 
=> ! (1)  
=> 0 that is false 

Замечаете ли вы в этом выражении есть два оператора логических || или и ! оператор НЕ.

!(1 || 0) 
    ^ ^
    NOT OR 

и уведомление для оператора ИЛИ || есть два операнда бит синглом унарный НЕ

+0

* Урок, в котором вы находитесь, является хорошим одним * –

2

Наиболее частым случаем является, вероятно, с std::istream:

int i; 
std::cin >> i; 
if (! std::cin) { 
    // Something went wrong... 
} 

Другие, чем все виды классы имеют isValid() или isDone() функции; итерировать с использованием итератора GoF для Например:

for (IteratorType i(init); ! i.isDone(); i.next()) { 
    // Do something with i.element() 
} 

классов Карты часто имеют contains функцию, так что вы могли бы спросить

if (! myMap.contains(key)) 

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

bool found = false; 
int current = 0; 
while (! found && current != end) { 
    // maybe set found... 
} 
1

Задача оператора ! состоит в том, чтобы выражать выражение false в выражении true. Он чаще всего используется в качестве замены для == false или == 0. Это часто делает выражение легче читать:

если (! Р == NULL || p-> следующая = NULL)

такая же, как:

если (р || р > next)

[Хорошо, так что «легче читать» здесь явно весьма субъективно].

+0

Вы ошиблись в своих чеках. Это должно быть 'p! = NULL', если вы хотите избежать незаконного доступа на' p-> next'. – zneak

+0

Нет, я получил && вместо || неправильно... ;) –

1

У вас есть довольно много ответов, объясняющих оператор NOT.

Я сам не большой поклонник оператора !. Это не так заметно, как должно быть (в этом оно меняет смысл предложения).

Например, несмотря на несколько лет программирования на C++, мне по-прежнему требуется несколько секунд для разбора if (! ptr), а не if (ptr == NULL), который мгновенно передает мне его смысл.

Выполняет ли if (! (i % 2)) четные или нечетные числа? Если у вас не было ответа после того, как ваши глаза прошли мимо «?» И/или должны были снова просмотреть условие if, вы только что сделали свое дело.

Рассматривая сообщения, я согласен с некоторыми плакатами, которые действительный оператор NOT имеет применительно к bool и вызовам функций. Использование ! при обработке потоков считается идиоматическим.

Тем не менее, почти каждый программист, которого я знаю, был укушен strcmp. Я работал в магазине, который имеет несколько #define s, таких как #define STRCMP_EQUAL 0 и т. Д., И потребовал, чтобы чек был написан как if (STRCMP_EQUAL == strcmp(str1, str2)), который, на мой взгляд, на несколько порядков больше, чем if (! strcmp(str1, str2)).

1

! оператор может использоваться с определенными пользователем типами данных (классы и структуры в C++). , как и любой оператор (ожидать.: И: :)! Оператор может быть перегружен. См. Следующий сценарий.

//A is empty if memeber size is 0, and no further operations are allowed on other members if 
// class is empty. 
class A{ 
int size; 
int lot; 
int price; 
public: 
    bool operator!() 
    { 
     if(lot) 
     return true; 
     else 
     return false; 
    } 
}; 

A AObj; 

//Aobj has size greater than 0 
if(!Aobj) 
{ 
//code to Fill or reuse the object. 
} 
1

Точка зрения! оператор должен сделать выражение, которое является ложным в истинное выражение. Это наиболее часто используется в качестве замены для == ложной или == 0. Это часто делает выражение легче читать:

если (р == NULL || р> Следующий! = NULL)

так же, как: (! р || р> следующая)

если

[Ok, так что "легче читать" здесь, очевидно, весьма субъективны].