В настоящее время вы просматриваете C++, используя this tutorial. Он объясняет, что такое оператор ! NOT
, но я не думаю, что полностью понимаю, почему я когда-либо хотел его использовать. Может кто-нибудь объяснить?В чем смысл оператора NOT?
ответ
Итак, вы хотите разделить сумму двух чисел на третью, чтобы вы могли сделать это, если третье число не равно нулю.
#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;
}
Я использовал простой пример, чтобы быстро его понять. Теперь все в порядке? С уважением и удачи в учебе.
Я не думаю, что это очень хороший пример.'! =', конечно, не то же самое, что и '!', а использование '!' как сокращенного способа сравнения с нолем не является идеальным. – Pubby
Я знаю, но он только начал изучать С ++, и я просто хотел дать ему ключ к этому типу оператора. Когда он станет «большим мальчиком», он поймет, что я глупый новичок, и мой ответ отстой. Пока, хорошо держать его коротким и простым. –
Оператор !
полезен, если вы хотите проверить, что условие в настоящее время не выполнено.
Представьте себе функцию, которая говорит вам, если конкретная подсистема приложения инициализации и другая функция для инициализации:
bool subsystem_is_initialized();
void subsystem_initialize();
Вы можете проверить, что он был инициализирован и инициализировать его, если он не был с помощью не оператор.
if (!subsystem_is_initialized())
subsystem_initialize();
Для всех практических целей, это более короткий путь, чтобы сравнить значения до нуля, с явным предложением, что пострадавшее значение имеет логическое значение. Вам это совсем не нужно, но опять же, вам тоже не нужны умножения (вы можете перебрать дополнение), дополнения (вы можете сделать это с помощью двоичной логики) или большую часть двоичной логики (вы можете делать почти что угодно с NANDs, мне сказали, но я не исследовал его сам).
Также имейте в виду, что, как и почти все другие операторы на С ++, он может быть перегружен классами.
Не говоря уже о том, что это бесконечно читаемо, чем в явном сопоставлении с 0. – svidgen
Вы также можете «удвоить отрицание», чтобы сделать что-то буквальным булевым. '!!' - это шаблон, часто встречающийся в динамически типизированных языках, где он сначала отличает 'true' или' false', а затем инвертируется. Это реже встречается в C++, где 'return foo' автоматически переходит к соответствующему типу возврата. – tadman
!
Оператор используется для отрицания в условиях проверки состояния bool. Есть много мест, где вы можете его использовать. Простой пример:
if (!existInArray(A, i))
проверить, если i
НЕ существует в массиве.
Язык не всегда (на самом деле так хорош, как никогда), который имеет минимальный набор функций, но набор полезных функций. Например, если вы имели следующий код:
if (!test_something())
do_something();
Вы могли бы также выразить это как
if (test_something()) {
} else
do_something();
, но это было бы не так легко читать. Таким образом, хотя логическое отрицание обычно может быть выражено другими конструкциями языка C++, оно помогает читаемости явно выражать отрицание, чтобы указать ваше намерение.
!
или оператор NOT является логическим эквивалентом ворот NOT
.
Итак, в таблице правды ворот NOT
говорится, что если верно x
, то !x
является ложным. и наоборот.
Не слишком сложно, если вы думаете об этом логически. Например, НЕ мужчины - это женщина, НЕ истинная ложь, НЕ простая сложна.
Используется, когда вам нужно перевернуть истину/ложь в состоянии, чтобы повысить читаемость. , например. Сравнить
// Ensure that the thing is NOT red.
if (thing_is_red() == false)
...
if (!thing_is_red())
...
Это также намного лучше, чем строгое утверждение против 'NULL', как в' if (pointer! = NULL) 'versus' if (pointer) 'или' if (pointer == NULL) 'as' if (! Pointer) '. – tadman
@tadman Это будет зависеть от используемого стиля кодирования. Лично я использую '!' Для переключения условий, где я сравниваю true или false. Я считаю, что замена явных сравнений на NULL или другие значения данных требует слишком большого знания конкретных особенностей любого языка, который вы используете. True/false существуют за пределами компьютеров, в традиционной логике, которые нужны всем * программистам *, независимо от используемого языка программирования. –
Если вы не знаете «особые причуды» на C++, вероятно, вам не нужно программировать на C++, так как не зная, как правильно использовать бензопилу, вы не должны ее использовать. Прощение - это не термин, который можно было бы использовать для описания C++. – tadman
НЕ: Оператор НЕ принимает один входной сигнал. Если этот вход 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
и уведомление для оператора ИЛИ ||
есть два операнда бит синглом унарный НЕ
* Урок, в котором вы находитесь, является хорошим одним * –
Наиболее частым случаем является, вероятно, с 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...
}
Задача оператора !
состоит в том, чтобы выражать выражение false
в выражении true
. Он чаще всего используется в качестве замены для == false
или == 0
. Это часто делает выражение легче читать:
если (! Р == NULL || p-> следующая = NULL)
такая же, как:
если (р || р > next)
[Хорошо, так что «легче читать» здесь явно весьма субъективно].
Вы ошиблись в своих чеках. Это должно быть 'p! = NULL', если вы хотите избежать незаконного доступа на' p-> next'. – zneak
Нет, я получил && вместо || неправильно... ;) –
У вас есть довольно много ответов, объясняющих оператор 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))
.
! оператор может использоваться с определенными пользователем типами данных (классы и структуры в 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.
}
Точка зрения! оператор должен сделать выражение, которое является ложным в истинное выражение. Это наиболее часто используется в качестве замены для == ложной или == 0. Это часто делает выражение легче читать:
если (р == NULL || р> Следующий! = NULL)
так же, как: (! р || р> следующая)
если
[Ok, так что "легче читать" здесь, очевидно, весьма субъективны].
Я был бы очень заинтересован в том, как бы вы тогда выражали 'if (! X)' без него ... – PlasmaHH
@PlasmaHH: 'if (static_cast (x) == false)', * очевидно *. –
Fanael
, очевидно, модная вещь, которую нужно сделать, это если (x) {тогда ничего не делать} else {do something}. –