little_greg Опубликовано 17 апреля, 2009 Жалоба Поделиться Опубликовано 17 апреля, 2009 Объясните кто-нибудь, пожалуйста, доступным языком, что такое унарное отрицание, и как оно работает. Имеется ввиду в сзыке C++ Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 17 апреля, 2009 Жалоба Поделиться Опубликовано 17 апреля, 2009 little_greg: А бинарного отрицания и не бывает. Все операции в C делятся на унарные, бинарные и тернарные. Унарные операции используют только один аргумент (кстати, аргументы операций часто называют операндами), бинарные - два, тернарные - три. Бывает, что один и тот же знак используется для обозначения и унарной и бинарной операций, например, в выражениях -b и a-b. Отрицание всегда использует только один аргумент, поэтому оно всегда унарное. Логическое отрицание обозначается знаком ! и применяется при проверках, равно ли какое-то выражение нулю. В C и в C++ принято, что в операторах if и прочих подобных проверяется равенство или неравенство выражения в условии нулю, вот логическое отрицание и "переворачивает" значение условия. Если выражение равно 0, оно выдает 1, а если не равно нулю, то выдает 0. Например, !5 равно 0, а !0 равно 1. Есть, кстати, в C еще и побитовое отрицание, естественно, тоже унарное, оно переворачивает значение каждого бита в машинном представлении числа, но его используют редко. Ссылка на комментарий Поделиться на другие сайты Поделиться
Ф@РТОВЫЙ Опубликовано 18 апреля, 2009 Жалоба Поделиться Опубликовано 18 апреля, 2009 (изменено) 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) Изменено 21 апреля, 2009 пользователем Лорд Дмитрий Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 18 апреля, 2009 Автор Жалоба Поделиться Опубликовано 18 апреля, 2009 спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
little_greg Опубликовано 18 апреля, 2009 Автор Жалоба Поделиться Опубликовано 18 апреля, 2009 в этой части программы ищется элемент массива, вот у меня вопрос по второму условию 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); ... Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 18 апреля, 2009 Жалоба Поделиться Опубликовано 18 апреля, 2009 (изменено) Правильно. 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:. Изменено 18 апреля, 2009 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Хексем Опубликовано 20 апреля, 2009 Жалоба Поделиться Опубликовано 20 апреля, 2009 Объясните кто-нибудь, пожалуйста, доступным языком, что такое унарное отрицание, и как оно работает. Имеется ввиду в сзыке C++ Оперидил меня в вопросе =) P.S.: Спасибо всем ответившим :bye1: Ссылка на комментарий Поделиться на другие сайты Поделиться
Ф@РТОВЫЙ Опубликовано 21 апреля, 2009 Жалоба Поделиться Опубликовано 21 апреля, 2009 Хексем: Флудим! :) Может кому пригодится, хотя у самого надобности не возникало Вариант 3, побитовое отрицание или побитовое не int x = 0; //0x00000000int y = ~x; //0xFFFFFFFFint a = 50; //0x00000032int b = ~a; //0xFFFFFFCD Записывается как ~выражение (тильда выражение), меняет все биты значения выражения на противоположные Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения