[flame][holywar]a & (a - 1)
а заменить выражение на inline функцию с камментом было бы неплохо
Совершенствоваться с каждой строкой,
Иначе чтение будет пустой забавою" (с) Oscar Wilde.
![](/images/graemlins/laugh.gif)
<это единственное, что я тут понял ^-^ >
Человек, читающий код, будет постоянно спотыкаться об этот &, даже если он знает, как это работает. В случае с inline функцией, код будет читаться нормально всегда, но работать точно так же.
Возможно, после длительного чтения/писания кода, насыщенного такими изящными вещицами, я тоже перестану спотыкаться о них взглядом? Я уже почти перестаю!
Но иногда люди хотят потом спихнуть код на негров и наслаждаться результатами под звуки классической музыки, а не под стук клавиш. В этом случае лучше хоть иногда заботиться о меньших братьях.
"0 !=" убрать (заменить на "!") и будет порядок.
По возможности, при прочих равных использую тернарный оператор.
Но для простоты чтения.
---
...Я работаю антинаучным аферистом...
Они будут читать мой код, периодически испытвать сатори, и, соответственно, будет расти их зарплата.
"0 !=" убрать (заменить на "!") и будет порядок.Есть языки, в которых это некорректно.
Опытный программист его знает, а неопытный должен выучить его наизусть
точно так же, как и смысл операторов "&&" и "||".
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
У моей Виртуальной Машины вполне чёткие спецификации, в которых даже указан размер инта, так что я вполне спокоен на этот счёт =)
>> "0 !=" убрать (заменить на "!") и будет порядок
Создатели моего Любимого Языка весьма радикально поборолись с "if (a = b)", запретив автоматический каст инта к булу в условии ифа. В общем, это довольно удобно.
Вот чёрт!
Уже и здесь наследили.
Александры македоцковы.
---
"...Надо учиться --- не напрягаясь!.."
Смысл этих операторов, кстати, радикально поменялся где-то лет двадцать назад, когда автор одного с-подобного языка разрешил оператор оверлоадинг. Как это ни удивительно, многие программисты и преподаватели программирования это изменение не заметили, и используют предыдущий смысл
: * over 2 = over 2 = and abs >r * r> + ;
Не очень удачное решение.
Лучше было оставить как есть и сделать приведение к логическому типу.
А для логического типа правильно определить "&" и "|".
Все слова понятны.
Все действия в коде вроде тоже.
Но ни то, ни другое, ни то и другое вместе никак не желает складываться во что-нибудь осмысленное.
Я ещё у Мадкроза по аське спросил - он тоже вообще ничего не понял.
/* if rcvBufferSize is a power of 2 */или что-нибудь в этом духе.
![](/images/graemlins/smile.gif)
Там это в тексте эксепшена написано =)
Потом, принцип "не рой яму другому - сам в неё попадёшь" ещё не отменили.
![](/images/graemlins/smile.gif)
Я бы всё-таки поставил комментий.
чтобы он заметно отличался от сравнения.
Я понимаю, что насильникам было не до рассуждений,
им лишь бы работу сделать, я понимаю, что потом потребовалась
совместимость, но начерта городить чёрт знает что при создании
совершенно нового языка --- вот что мне непонятно.
Если делается логический тип, ведущий себя как один двоичный разряд,
то более имеет смысл оставить для него поразрядные действия,
а старые логические действия, когда от целого числа
бралось его логическое значение, оставить как есть
или расширить так, чтобы если от какого объекта
определить логическое значение, то бралось бы последнее.
Вроде того, список не пуст, ссылка не ведёт в никуда,
что-то ещё создано, непусто, отрисовано, отработало и т. п.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
А про разницу & и && ты, кажется, не понял.
В языке С семантика была такая: & - побитовый, && - логический, к логическому в качестве бесплатного дополнения даются ленивые вычисления (и то я не уверен, что в раннем стандарте эта опция была по дефолту включена).
Начиная с С++ семантика в корне поменялась: & - неленивый, && - ленивый, для логических и целочисленных типов добавляется дополнительная семантика, уже вытекающая из этого.
Ты зря, на самом деле, это надо ценить.
Я не помню, как там в раннем стандарте.
Поразрядность сама собой влечёт жадность.
Если логический тип представлять одним разрядом
или равносильно таковому, то на целых и логических типах
плюсы ничего не поменяли, кроме исключения приведения
целого к логическому.
---
...Я работаю антинаучным аферистом...
P. S. Загляни в соседнее обсуждение.
Подумай ещё раз внимательно.
Плюсы подходят к делу с совершенно другой стороны. Правда, таким образом, что любой сишный код сохраняет свою семантику.
Разница такая же существенная (правда, немного в другой плоскости как между [] в С и оператором [] в С#: первое - это сокращённая запись dereference со сложением, второе - это сокращённая запись вызова метода Item(...)
Типа, код в большинстве случаев вроде выглядит одинаково, и компилится приблизительно в одинаковые вещи, но на самом деле - небо и земля, и это становится понятно, когда в С кто-нибудь пишет 3[a], а на шарпе - а["zzz", 13, true].
>> плюсы ничего не поменяли, кроме исключения приведения целого к логическому.
Ты о плюсах или о шарпе?
"x" --- это "##", по определению.
Типа, знаки альтерации, 1-й год обучения муз. школы.
Не вижу разницы, кроме как той, что (недо)приплюснутые разбивают
предыдущую семантику начисто.
В сях
0ead & 0xbeef --> 0x9ead
0ead && 0xbeef --> 0xbeef (с ленивостью вычислений)
0 && a/0 --> 0
1 && a/0 --> undefined
В (недо)приплюснутых, как ты утверждаешь, целые не приведутся к логическим.
Как я понял.
Или
if(0ead && 0xbeef) puts("Ha!");
всё-таки работает?
---
...Я работаю антинаучным аферистом...
> писать код именно такого вида
Только если нравится писать всё по три раза по три раза по три раза, как в яве.
1) В языке С нет типа bool, вообще ни одного. Поэтому
The logical-AND operator produces the value 1 if both operands have nonzero values. If either operand is equal to 0, the result is 0. If the first operand of a logical-AND operation is equal to 0, the second operand is not evaluated.
2) В языке С++ есть тип bool, поэтому
The logical AND operator (&&) returns the boolean value true if both operands are true and returns false otherwise. The operands are implicitly converted to type bool prior to evaluation, and the result is of type bool. Logical AND has left-to-right associativity.
На первый взгляд разницы не видно, поскольку C++ bool умеет имплицитно конвертиться в 0/1. "if", соответственно, в сишном случае требует ненулёвости аргумента, в плюсовом - эвальюэейтит аргумент в bool и требует истинности, те же яйца, вид сбоку, пока мы рассматриваем переход от С к С++.
Но в языке С++ вообще-то операторы можно перегружать произвольным образом, поэтому для произвольных сущностей a и b сам язык фиксирует едининственное ограничение по семантике, в котором & отличается от &&: один ленивый, второй неленивый. Ну и precedence у них немножко разный. А вот из этого и из общего смысла (что действие должно иметь нечто общее с конъюнкцией) уже следуют разные следствия, что типа побитовое сложение никак не может быть ленивым, например.
Более того, вот эти все тонкости на тему того, в каком порядке что во что преобразуется тоже внезапно получают некоторый смысл, так как в плюсах операторы преобразования типов тоже можно переопределять.
Object object = new Object;
набирается так:
ne
<Ctrl+Space>
<Enter>
O
<Ctrl+Space>
<Enter>
<Tab>
<Ctrl+Space>
<Enter>
<Tab>
<Del>
![](/images/graemlins/smile.gif)
Молодец. Только такой сгенерированный хитроумным редактором код читать таки приходится в виде простого текста.
Надо будет проверить.
Если всё так, как ты говоришь, то да, код ломаться не должен.
Перегрузка операторов, да ещё и правила умолчательного преобразования типов --- это кошмар.
Оно хотя бы предупреждения даёт, что куда преобразовало?
Или это только по особой просьбе?
---
...Я работаю антинаучным аферистом...
А ты не сдохнешь, как та корова, если на каждую строчку получишь по предупреждению?
Можешь не повторяться, а давать переменным дурацкие имена.
Можно было бы не называть конструктор именем класса, а оставить как в виртуальной машине - <init>.
Так было бы удобнее?
Прочитать 3 похожих слова - не такая уж и тяжёлая работа. ИМХО, тяжелее было бы гадать: "что общего между этими тремя разными названиями?"
К счастью, сразу же было предложено решение получше - inline функция. Ну или #define.
![](/images/graemlins/lol.gif)
![](/images/graemlins/lol.gif)
![](/images/graemlins/lol.gif)
А почему не в -666? Лечись, пока есть надежда, пока диагноз опять не изменился.
![](/images/graemlins/smile.gif)
Типы, кстати, не обязательно преобразовывать неявно. Есть ключевое слово explicit.
Не понимаю. Можно пример?
___
Ибо так завещал великий Ленин.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
___
![](/images/graemlins/censored.gif)
![](/images/graemlins/censored.gif)
![](/images/graemlins/censored.gif)
#define _ispow2(n) n)&n)-1
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Только я вообще-то не тот вопрос задавал.
Ещё раз говорю, лечись пока не поздно. Сам себе потом ещё не раз спасибо скажешь.
![](/images/graemlins/smile.gif)
под интересующую меня платформу их нет, только кросс.
Да и код будет слишком громоздким.
Подчёркивание для того, что не WFF.
---
"Люди недалёкие обычно осуждают всё, что выходит за пределы их понимания."
Нет, ну это просто жемчужина C++-творчества, не считая static, int (вместо bool подчёркивания, лишних скобок после return, макроса со всеми присущими ему недостатками (навскидку, отсутствие пространства имён и проверки типов, а также дословное упоминание аргумента дважды) и отсутствия проверки на положительность.
Ты прогнал, начиная со слов "С++-творчества" и далее. Подумай почему (подсказку уже дал даже
![](/images/graemlins/wink.gif)
Оставить комментарий
bleyman
Как известно некоторым людям, для целого положительного а выражение a & (a - 1) равно нулю в том и только том случае, если а является целой степенью двойки. Все остальные люди могут это проверить руками.Внимание, вопрос: считаете ли вы допустимым (и, более того, необходимым) писать код именно такого вида
в случае, если возникает необходимость проверить то, что необходимо проверить вот в этом конкретном случае?
Или призрак неграмотного сан-техника, тупо хлопающего глазами на такой код, вызывает в вас непреодолимое желание написать цикл, рекурсивную функцию, привести к даблу и взять логарифм наконец? Тогда, кстати, второй вопрос - тернарный оператор вы тоже не используете по той же причине (сложность для чтения неопытным программистом)?