оператор - 2 восклицательных знака
От: ChistovSE  
Дата: 05.08.10 18:29
Оценка: :)
Что означает двойной отрицательный знак в исходном коде:

static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
{
input_event(dev, EV_KEY, code, !!value);
}
-------------------------
Сергей Ч.
Нижний Новгород
Re: ни ни!!!
От: Erop Россия  
Дата: 05.08.10 18:32
Оценка: 2 (1)
Здравствуйте, ChistovSE, Вы писали:

CSE>Что означает двойной отрицательный знак в исходном коде:

CSE>  static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
CSE>{
CSE>    input_event(dev, EV_KEY, code, !!value);  /* *** */
CSE>}

Он обозначает сравнение с нулём /* *** */ эквивалентно этому:
    input_event(dev, EV_KEY, code, value != 0 );
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: ни ни!!!
От: ChistovSE  
Дата: 05.08.10 18:36
Оценка: +1 :)
Здравствуйте, Erop, Вы писали:

E>Он обозначает сравнение с нулём /* *** */ эквивалентно этому:
    input_event(dev, EV_KEY, code, value != 0 );


Спасибо за помощь, а то гуглить замучался .
-------------------------
Сергей Ч.
Нижний Новгород
Re: оператор - 2 восклицательных знака
От: Vamp Россия  
Дата: 05.08.10 18:36
Оценка:
CSE>Что означает двойной отрицательный знак в исходном коде:
Это такой трюк для превращение value в логическую единицу. Полученное значение можно сравнивать с другой логической единицей оператором =.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: ни ни!!!
От: Erop Россия  
Дата: 05.08.10 18:37
Оценка: 1 (1) -1 :)
Здравствуйте, ChistovSE, Вы писали:

CSE> Спасибо за помощь, а то гуглить замучался .

Всегда пожалуйста.
Для "спасибо" тут есть кнопки
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 18:50
Оценка: +6
Здравствуйте, Vamp, Вы писали:

V>Это такой трюк для превращение value в логическую единицу. Полученное значение можно сравнивать с другой логической единицей оператором =.


1) Лучше, всё-таки сравнивать оператором ==
2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: оператор - 2 восклицательных знака
От: Vamp Россия  
Дата: 05.08.10 18:59
Оценка: :))
E>1) Лучше, всё-таки сравнивать оператором ==
Ну, это понятно. Опчтк.
E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0
Запись короче.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 19:00
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Запись короче.

Типа на символ? прикольный подход к кодированию...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: оператор - 2 восклицательных знака
От: Vamp Россия  
Дата: 05.08.10 19:02
Оценка:
E>Типа на символ? прикольный подход к кодированию...
Гораздо больше, чем на один символ.
x != 0 — 6 символов.
!!х — 3 символа. В 2 раза быстрее!
Да здравствует мыло душистое и веревка пушистая.
Re[3]: оператор - 2 восклицательных знака
От: Mr.Delphist  
Дата: 05.08.10 19:04
Оценка: -3
Здравствуйте, Erop, Вы писали:

E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0


Как я понимаю, это пошло-поехало от умных указателей. Там оператор "!" переопределяется с целью изучить внутреннее содержимое, а не обертку.

p = NULL;
if (p)
{
  // do something
}
if (!!p)
{
  // do something
}


Если p — обычный указатель, то оба if пролетят мимо, а если p — "умный", то в первый if мы таки заскочим. Получается, что написание !! превращает код в легко мигрирующий (или безопасную заготовку для шаблона).
Re[6]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 19:07
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Гораздо больше, чем на один символ.

V>x != 0 — 6 символов.
V>!!х — 3 символа. В 2 раза быстрее!

Ну пробелы-то можно и не писать. Кроме того надо ещё учитывать, что не x, а value

Так что получаем !!value (7символов) против value!=0 (8символов)... Не такая уж и экономия-экономия.


Но подход всё равно прикольный Наверное тогда ещё все переменные надо называть одной буквой, а функции двумя, а в больших прогах тремя
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 19:09
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Если p — обычный указатель, то оба if пролетят мимо, а если p — "умный", то в первый if мы таки заскочим. Получается, что написание !! превращает код в легко мигрирующий (или безопасную заготовку для шаблона).


Не понятно, чем же != 0 плох в этом контексте.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 19:10
Оценка: +1
Здравствуйте, Mr.Delphist, Вы писали:

MD>Как я понимаю, это пошло-поехало от умных указателей. Там оператор "!" переопределяется с целью изучить внутреннее содержимое, а не обертку.


Думаю, что ты ошибаешься, кстати. Так как такие конструкции были популярны в нативном С задолго до появления умных указателей
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 19:21
Оценка:
Здравствуйте, Vamp, Вы писали:

E>>1) Лучше, всё-таки сравнивать оператором ==

V>Ну, это понятно. Опчтк.

Интересно, какая именно. Так как сравнивать можно и оператором ^ и оператором -, ну и != и == тоже, кстати, но *крутые С-кодеры*, я так понимаю, таких лёгких путей не юзают?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: оператор - 2 восклицательных знака
От: Vamp Россия  
Дата: 05.08.10 19:27
Оценка:
E>Интересно, какая именно.
Угадай.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Неужели крышка? ;) (-)
От: Erop Россия  
Дата: 05.08.10 19:29
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Угадай.


Неужели крышка?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: оператор - 2 восклицательных знака
От: dilmah США  
Дата: 05.08.10 19:29
Оценка: 2 (2) +1
E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0

это видимо зависит от людей и их бэкграунда.

Для меня более понятно !!x
Почему. Взгляд сразу видит двойное отрицание, сразу очевидно что двойное отрицание не меняет логического значения x. С другой стороны известно, что результат любого логического выражения это либо 1 либо 0.
Поэтому сразу видно, что логическое значение не меняется, и оно только нормализуется к 1/0

Когда я смотрю на x != 0 мне уже нужно думать, а что же тут происходит, мозг не находит такой очевидной подпорки как двойное отрицание, тут нет автоматизма, мне нужно на пару секунд задуматься, чтобы понять что логическое значение не меняется.
Re[7]: Неужели крышка? ;) (-)
От: Vamp Россия  
Дата: 05.08.10 19:31
Оценка: :)
E>Неужели крышка?
А вот и не угадал. Ты проиграл, с тебя миллион юаней.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 19:33
Оценка:
Здравствуйте, dilmah, Вы писали:

D>Когда я смотрю на x != 0 мне уже нужно думать, а что же тут происходит, мозг не находит такой очевидной подпорки как двойное отрицание, тут нет автоматизма, мне нужно на пару секунд задуматься, чтобы понять что логическое значение не меняется.


Прикольно. А если
x != FALSE


Как бы пишут: "икс не ноль/ложь". Неужели нечитабельно?

Кроме того, в приведённом контексте название переменной наводит на мысли, что это таки число. Что такое "двойное отрицание пяти", например?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Отправил в личку. ;)
От: Erop Россия  
Дата: 05.08.10 19:36
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А вот и не угадал. Ты проиграл, с тебя миллион юаней.


А зачем тебе юани, кстати? США скоро планирует сдаваться КНР?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: Отправил в личку. ;)
От: Vamp Россия  
Дата: 05.08.10 19:38
Оценка: :))
E>А зачем тебе юани, кстати? США скоро планирует сдаваться КНР?
Ответа нет. Оффтопик и флейм прекращен в зародыше.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: оператор - 2 восклицательных знака
От: rg45 СССР  
Дата: 05.08.10 20:06
Оценка:
Здравствуйте, Vamp, Вы писали:

E>>Типа на символ? прикольный подход к кодированию...

V>Гораздо больше, чем на один символ.
V>x != 0 — 6 символов.
V>!!х — 3 символа. В 2 раза быстрее!

А что если "x" в коде выглядит как a — b? Тогда еще пару скобочек посчитать придется
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: оператор - 2 восклицательных знака
От: dilmah США  
Дата: 05.08.10 20:18
Оценка: 1 (1) :)
E>Кроме того, в приведённом контексте название переменной наводит на мысли, что это таки число. Что такое "двойное отрицание пяти", например?

ну а в чем проблема. В Си исходно булевого типа не было, их роль играли целые.
Двойное отрицание не меняет логического значения и только нормализует в 1/0.
Пятерка нормализуется в единицу.
Re[5]: оператор - 2 восклицательных знака
От: Warturtle  
Дата: 05.08.10 22:07
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Mr.Delphist, Вы писали:


MD>>Если p — обычный указатель, то оба if пролетят мимо, а если p — "умный", то в первый if мы таки заскочим. Получается, что написание !! превращает код в легко мигрирующий (или безопасную заготовку для шаблона).


E>Не понятно, чем же != 0 плох в этом контексте.

Ничем не плох. Имею такую версию (например). '!!' располагается целиком слева и оттого (дичайше) напоминает операторную запись — в математическом смысле (Fx или F(x)). То есть это (вощемто) оператор "естественного вложения" какого-то объемлющего множества — "кольца" — в {0, 1}.
Re[6]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 22:12
Оценка:
Здравствуйте, dilmah, Вы писали:


E>>Кроме того, в приведённом контексте название переменной наводит на мысли, что это таки число. Что такое "двойное отрицание пяти", например?


D>ну а в чем проблема. В Си исходно булевого типа не было, их роль играли целые.

Проблема в том, что нечитабельно. Если у тебя value -- это число, а не логический тип, то не понятно как-то, что такое его отрицание
Кроме того, приличные люди в С писали что-то типа
typedef int BOOL;


D>Двойное отрицание не меняет логического значения и только нормализует в 1/0.

D>Пятерка нормализуется в единицу.
Спасибо, С я знаю. Но я не понимаю, зачем писать Сщные ребусы вместо понятного кода
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 05.08.10 22:14
Оценка:
Здравствуйте, Warturtle, Вы писали:

W>Имею такую версию (например). '!!' располагается целиком слева и оттого (дичайше) напоминает операторную запись — в математическом смысле (Fx или F(x)). То есть это (вощемто) оператор "естественного вложения" какого-то объемлющего множества — "кольца" — в {0, 1}.


Что-то мне так кажется, что таким соображением никто ни разу не пользовался, при написании !!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: оператор - 2 восклицательных знака
От: Вумудщзук Беларусь  
Дата: 06.08.10 06:48
Оценка: 1 (1) :)
>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0
почему страдать? если есть BOOL a, b; // где BOOL — какой-нть очередной typedef int
то в написании if (!!a == !!b) меньше страданий, чем в if ((a && b) || (!a && !b))
тчк
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 06.08.10 09:22
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0

В>почему страдать? если есть BOOL a, b; // где BOOL — какой-нть очередной typedef int
В>то в написании if (!!a == !!b) меньше страданий, чем в if ((a && b) || (!a && !b))

Боже ж мой! Ты контекст исходного сообщения видел?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: оператор - 2 восклицательных знака
От: Eternal  
Дата: 06.08.10 10:08
Оценка:
Здравствуйте, Erop, Вы писали:

E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0


С int действительно разницы никакой. Код смахивает на С-шный, но если бы там был шаблонный аргумент:
static inline void input_report_key(struct input_dev *dev, unsigned int code, T value)

то есть мнение, что !! наиболее безопасный способ конвертации в bool:
http://www.artima.com/cppsource/safebool.html
Лучше, конечно, такого избегать.
safebool
Re[5]: оператор - 2 восклицательных знака
От: Вумудщзук Беларусь  
Дата: 06.08.10 10:57
Оценка:
>Боже ж мой! Ты контекст исходного сообщения видел?
а что с ним не так ?
тчк
Re[3]: оператор - 2 восклицательных знака
От: baboon12345  
Дата: 06.08.10 14:35
Оценка:
Здравствуйте, Erop, Вы писали:

E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0

Для ненулевых значение удобно писать проверки

if ( i )
{
}


минус данной конструкции — warning(losing data бла-бла int to bool)
Re[3]: оператор - 2 восклицательных знака
От: andpar  
Дата: 06.08.10 15:08
Оценка:
E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0

Это невсегда возможно. Одно время был подход определять оператор! для преобразования в bool (т.к. сам operator bool имеет некоторые недостатки). Поэтому и писали так:

class A
{
public:
    bool operator!() const
    {
        return !good_;
    }
private:
    bool good_;  
};


Поэтому не сравнишь объект класса с нулем.
Re[4]: оператор - 2 восклицательных знака
От: andpar  
Дата: 06.08.10 15:15
Оценка:
MD>Как я понимаю, это пошло-поехало от умных указателей. Там оператор "!" переопределяется с целью изучить внутреннее содержимое, а не обертку.

MD>
MD>p = NULL;
MD>if (p)
MD>{
MD>  // do something
MD>}
MD>if (!!p)
MD>{
MD>  // do something
MD>}
MD>


MD>Если p — обычный указатель, то оба if пролетят мимо, а если p — "умный", то в первый if мы таки заскочим. Получается, что написание !! превращает код в легко мигрирующий (или безопасную заготовку для шаблона).


Покажи, хоть один такой пример умного указателя (кроме каких-нибудь своих доморощенных). В нормальных реализациях сделано так, что проверка умного указателя и обычного дают один и тот же результат (ну или, на худой конец, как в auto_ptr, вообще она не реализована). Т.е. не ошибешься
Re[3]: оператор - 2 восклицательных знака
От: . Великобритания  
Дата: 08.08.10 14:53
Оценка: 1 (1)
On 05/08/10 21:50, Erop wrote:

> 1) Лучше, всё-таки сравнивать оператором ==

> 2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0
А ещё есть javascript, и, наверняка ещё какие-нибудь подобные языки, где тип может быть не только число, а много чего — (строка, пустой массив и т.п.), которые тоже имеют логическое значение false, и привести к логическому типу проще всего именно с помощью !!.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: оператор - 2 восклицательных знака
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.08.10 19:45
Оценка: :))
Здравствуйте, Erop, Вы писали:

E>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0


Это разделяет читателей программы на 2 лагеря: равных автору в мудрости своей, и тех, кто ничего не понял
Re[4]: оператор - 2 восклицательных знака
От: Erop Россия  
Дата: 08.08.10 22:21
Оценка: 1 (1)
Здравствуйте, Pzz, Вы писали:

E>>2) Никогда не понимал, зачем так страдать. Нет бы написать понятно ххх != 0

Pzz>Это разделяет читателей программы на 2 лагеря: равных автору в мудрости своей, и тех, кто ничего не понял

Есть ещё и третий лагерь -- те, кто понял всё, кроме того, зачем так извращаться
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.