Подтвердить что ты не робот

Короткое замыкание небулевых

Можно ли сократить это использование троичного оператора:

process_ptr(ptr ? ptr : default_ptr);

с коротким замыканием:

process_ptr(ptr || default_ptr);

в C и С++? Другими словами, гарантируем ли мы, что мы вернемся либо из ptr, либо из default_ptr назад, или, возможно, допустимо, чтобы выражение приводило к произвольному "логическому истинному" значению, если выражение логически верно?

Это код, который вы видите во всем коде Perl, но я редко вижу его в C/С++, что исходная основа моего вопроса.

4b9b3361

Ответ 1

Второе выражение будет оценивать либо 1, либо 0.

Цитата стандартного черновика C11:

6.5.14 Логический оператор OR

  1. Оператор || должен давать 1, если один из его операндов сравнивается не равным 0; в противном случае он дает 0. Результат имеет тип int.

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

Edit

Один из комментариев утверждает, что этот ответ действителен только для c, а @Легкость гонки на орбите является правильным.

Есть также ответы, которые являются только правильными для С++ 1 хотя с ними только разница в том, что С++ имеет тип bool, а затем оценивает это выражение как bool вместо int. Но по-видимому, существует важная проблема с перегрузкой оператора || в С++, который запрещает короткую ссылку на объект, который перегружает его.

Итак, для С++ есть много вещей, которые нужно учитывать, но поскольку этот вопрос был помечен тегами обоих языков, тогда необходимо указать хотя бы различие.

Это правило применяется, когда применяется короткое замыкание, т.е. результат оценки выражений либо 1, либо 0 для c и true или false для С++.


1 Как и эти ответы: 1, 2

Ответ 2

Что касается стиля Perl, который обычно имеет тип

do_someting || die("didn't work")

Это также работает на С++.

function_returning_bool(some) || std::cout << "Error!" << std::endl;

Это связано с тем, что || является логическим оператором OR и вызывает короткое замыкание в этом случае, если возвращаемое значение истинно.

Но использовать его вместо тернарного оператора невозможно.

std::cout << ("asd" || "dsa");

Это приведет к выводу 1.

Ответ 3

Нет. Тип результата int (или bool в С++) и будет либо 1, либо 0 (true или false в С++).

Ответ 4

operator|| для указателей возвращает a bool, поэтому ptr || default_ptr будет оценивать до true, если либо ptr, либо default_ptr не являются нулевыми.