Jump to content
СофтФорум - всё о компьютерах и не только

Унарное отрицание.


Recommended Posts

little_greg:

А бинарного отрицания и не бывает. Все операции в C делятся на унарные, бинарные и тернарные. Унарные операции используют только один аргумент (кстати, аргументы операций часто называют операндами), бинарные - два, тернарные - три. Бывает, что один и тот же знак используется для обозначения и унарной и бинарной операций, например, в выражениях -b и a-b. Отрицание всегда использует только один аргумент, поэтому оно всегда унарное.

Логическое отрицание обозначается знаком ! и применяется при проверках, равно ли какое-то выражение нулю. В C и в C++ принято, что в операторах if и прочих подобных проверяется равенство или неравенство выражения в условии нулю, вот логическое отрицание и "переворачивает" значение условия. Если выражение равно 0, оно выдает 1, а если не равно нулю, то выдает 0. Например, !5 равно 0, а !0 равно 1.

Есть, кстати, в C еще и побитовое отрицание, естественно, тоже унарное, оно переворачивает значение каждого бита в машинном представлении числа, но его используют редко.

Link to comment
Share on other sites

little_greg:

Вариант 1, числовое отрицание или унарный минус

int a = 5;int b = -a;int c = -(a - b);// a == 5// b == -5// c == -(5 - -5) == -(5 + 5) == -10

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

Вариант 2, логическое отрицание или логическое "не"

bool x = true;bool y = !x;bool z = !(5 > 10);// x == true// y == false// z == !false == true

Меняет значение булевого выражения на противоположное (true на false и наоборот). Впринципе работает и с числовыми типами данных, false - это 0, а true - это все что не 0 (1, 5, 10, -500)

Edited by Лорд Дмитрий
Link to comment
Share on other sites

в этой части программы ищется элемент массива, вот у меня вопрос по второму условию if, правильно ли я понимаю, что, допустим программа нашла заданное значение и переменная found=1, тогда условие if(!found) равно if(!1=0) так как это ложь, то будет выполнятся инструкция после else - "printf("\nUkazannoe znachenie soderzhitsya v elemente %d\n", index);", а если бы заданное значение не нашлось, то if(!found) равно if(!0=1) тогда это истина, и следовательно выполняется инструкция "puts("\nUkazannogo znacheniya net v massive\n");"

...

printf("\nUkazhite znachenie, kotoroe hotite naiti: ");

scanf("%d", &num);

index=0;

found=0;

while (!found && index<10 && temps[index]!=555)

{

if (temps[index]==num)

found=1;

else

index++;

}

if (!found)

puts("\nUkazannogo znacheniya net v massive\n");

else

printf("\nUkazannoe znachenie soderzhitsya v elemente %d\n", index);

...

Link to comment
Share on other sites

Правильно. found - истина, если найдено. if(!found) в переводе на русский будет "если не найдено", вот и всё.

Можно было и вообще обойтись без found. Если нужное значение так и не найдется, то после выхода из цикла у index будет значение 10, найдется - меньше. Поэтому можно было записать цикл короче:

for(index=0; i<10 && temp[index] != num; index++);

if(index<10)printf("Eto element %d\n",index); else printf("Ne najdeno\n");

Впрочем, "понятнее" важнее, чем "короче" :).

Оффтоп
P.S. Дело в том, что C - это не столько язык программирования, сколько язык программистов. Писать программы можно было бы проще, но создатели C гордились умением выдумывать и применять разные трюки. Учиться на нем - то же, что учиться накрывать на стол у фокусника. Там, где программист на Паскале просто принесет бифштекс, программист C часто не просто принесет бифштекс, а еще и вытащит его из своей шляпы :bleh:.
Edited by Тролль
Link to comment
Share on other sites

Guest Хексем

Объясните кто-нибудь, пожалуйста, доступным языком, что такое унарное отрицание, и как оно работает.

Имеется ввиду в сзыке C++

Оперидил меня в вопросе =)

P.S.: Спасибо всем ответившим :bye1:

Link to comment
Share on other sites

Хексем: Флудим! :)

Может кому пригодится, хотя у самого надобности не возникало

Вариант 3, побитовое отрицание или побитовое не

int x = 0; //0x00000000int y = ~x; //0xFFFFFFFFint a = 50; //0x00000032int b = ~a; //0xFFFFFFCD

Записывается как ~выражение (тильда выражение), меняет все биты значения выражения на противоположные

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...