[C++] -1, если число отрицательное; 1, если положительное

[C++] -1, если число отрицательное; 1, если положительное

Зависит от компилятор и может быть даже от процессора. Вообще, в моём представлении первое должно происходить без участия сопроцессора, а второе — с участием (если без оптимизаций), поэтому зависит от того, что быстрее.

А скомпилировать в асм-код лень? Просто там всё равно jump'ы будут.

П.С. return std::signbit(x) ? -1 : 1; П.П.С. кроме более читабельной записи надо следовать правилу, что желательно в функции иметь только один return

>А скомпилировать в асм-код лень? Просто там всё равно jump'ы будут.

Необязательно. man cmovcc

Просто там всё равно jump'ы будут.

Будут, но короткие:

знаковый бит старший. return reinterpret_cast<uint64_t>(x) & ((uint64_t)1<<63);

return -1 + (reinterpret_cast<uint64_t>(x) & ((uint64_t)1<<63)) >> 62;

а если big-endian?

return -1 + (*(reinterpret_cast<uint64_t*>(&x)) & ((uint64_t)1<<63)) >> 62;

>The CMOVcc instructions are new for the Pentium® Pro processor family; however, they may not be supported by all the processors in the family.

Так что gcc вряд ли будет его использовать. Да и потом, вроде как с double не должен работать (костыль то можно сделать, но без оптимизации вряд ли будет).

>>знаковый бит старший.

Хаха, такие спецы :) Он всегда старший хоть на мидлэндиан. Это всего лишь повлияет на то как данные хранятся в памяти.

:))))) а почему бы не просто:

Тьфу - понял, там надо -1 по условию :)

П.П.С. кроме более читабельной записи надо следовать правилу, что желательно в функции иметь только один return

На x86 ?: в cmov завернётся.

> На x86 ?: в cmov завернётся.

А что с [code] return (x > 0 ? 1 : -1);[/code] ?

(Вариант x == 0 как я понял, считается несуществующим?)

> (Вариант x == 0 как я понял, считается несуществующим?)

может соответствовать или -1, или +1 — не важно

Зависит от компилятор и может быть даже от процессора. Вообще, в моём представлении первое должно происходить без участия сопроцессора, а второе — с участием (если без оптимизаций), поэтому зависит от того, что быстрее.

И от контекста зависит. Потому что если определить знак числа нужно где-то посередине вычислений, то быстрее с помощью сопроцессора, так как число уже в одном из его регистров и выгружать его в память не выгодно. Если же надо определить знак у числа, которое получено когда-то давно, то быстрее взять у него значение отдельного бита.

> надо следовать правилу, что желательно в функции иметь только один return Не надо.

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

П.С. а сайт жутко авторитетный - ага

> несколько точек выхода при обработке - вероятная утечка ресурсов RAII. В заголовке стоит [C++].

а сайт жутко авторитетный - ага

Таки да. Кроме того, там есть ссылки на весьма авторитетных авторитетов.

А программы это гуманитарщина, чтобы авторитетам в рот заглядывать? Не лучше ли пользоваться логикой?

Если очень хочется изобрести велосипед, можно и не заглядывать.

Своей логики нет анализировать разные мнения? Надо всё делать как авторитет сказал?

> Не лучше ли пользоваться логикой?

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

Это в философии может быть школа одноретурнов и школа многоретурнов с томами словесного поноса на эту тему. А в программах должно быть логическое обоснование, а логика не зависит от авторитетности её излагающего.

Ну да, авторитеты ведь никогда не аргументируют, почему нужно делать так, а не иначе. Самому-то не смешно? Пора уже остепениться.

1. Есть. 2. По ситуации.

Если это существенно облегчит жизнь в дальнейшем, почему бы и нет? Если задача сделать код exception safe, то почти обязательно.

> Если это существенно облегчит жизнь в дальнейшем, почему бы и нет?

т.е. вы к любой сишной библиотеке пишете свою обвязку?

В их рассуждениях не рассматриваются все ситуации

Таким образом «многоретурность» необходима. «Одноретурность» является её частным случаем. Поэтому все общие рассуждения про 1 или несколько return идут на йух. Только конкретные ситуации можно рассматривать. А если кто-то раскорячивается в программах ради 1 return потому что так Сам Авторитет сказал, то такой кодер просто тупой дебил.

Тупой дебил - это. Ах. Это guard statements.

я уже написал про то, что проверка входных условий - это отдельный случай, никак не связанный обработкой данных, если в твоем примере будет:

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

кто-то раскорячивается в программах ради 1 return

это ваша фантазия, я написал, что желательно иметь одну точку выхода, а не обязательно должна быть

И чё? Как ни назови это всё равно несколько return. Значит общий принцип «сдохни, но сделай только один ретурн» не действует.

Не принимай близко к сердцу. Пользуйся логикой.

lester, такое ощущение,что вы программ то в жизни не писали, хех:-/

Вот, чтоб далеко не ходить, без всяких авторитетов, просто из жизни, возьмите любой лексический анализатор написанный на C. Примеров в репозитории GNU масса, и убедитесь.

Избегать многих ретурнов это то же, что и избегать continue, break, и goto - в некоторых случаях лишь запутывает.

(И вообще-достали эти сказки - одноретурность вам никак не поможет избежать даже и малой доли ваших утечек ресурсов, так практика показывает. Утечки возникают в ситуациях куда более изощрённых.)

В целом же, многоретурность естественна, это следствие использования анализа use case-ов, для проектирования ваших процедур. Избегать ее-это значит наживать себе лишние сложности из пустого места.

* вручную написанный на С (без lex/flex).

Лопухом не надо быть чтоб такое не писать.

Есть идиоматические конструкции, привычные всем, пользуйтесь ими.

Любой сможет написать while ((c = getchar()) != EOF) { . }

Достали книги, в которых говорится, как нам следует писать программу. Но ни одной более-менее серьёзной программы не приводится. Последние 10 лет я только и занимаюсь, что анализирую чужой код с 18-00 до 00-00 и изучаю чужие методы проектирования, а с 08-00 до 16-00 пишу свой код, так что парни-не надо говорить мне, как я должен делать:-)

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

Так вот скажу вам по правде-действительно, точка выхода как правило одна, и средняя длина не более 40 строк. Но это-следствие правильного проектирования функции, не более.

Если вы просто будете стремиться тупо выполнять правила подобные этим, то уподобитесь туземцам (см. Культ Карго) :-)

уважаемый анонимус - я очень ценю ваше ЧСВ и то что вы так долго расписывали свое мнение, но:

1. «действительно, точка выхода как правило одна, и средняя длина не более 40 строк» - здорово, что вы это признали 2. примеры неудобности одноретурного подхода где? ( ес-но без учета проверки параметров )

📎📎📎📎📎📎📎📎📎📎