Как написать одну строку и вложенный оператор if без '?:' (Возможно ли это?)

Можно ли написать одну строку if-else заявление (т.е. только с использованием одного ;) без использования ?: выражение? Например что-то в форме: if (p == 1) " " else "\n";

Потенциальная цель может быть: cout << if (p == 1) " " else "\n";

Просто любопытно, если это возможно, не знаю, есть ли практические применения для этого.

Спасибо

5 ответов

Решение

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

if утверждение (как и все утверждения) не дает значения, в то время как ?: оператор - это выражение, которое дает значение.

Различие между утверждениями и выражениями является фундаментальной концепцией, которую стоит изучить (посмотрите ссылки в этом ответе и не торопитесь!), Не только для C++, но и почти для всех языков программирования.

Вы спрашиваете, "как мне сделать X без использования инструментов, которые предоставляет язык для выполнения X". Это глупо.

И ответ нет. Это невозможно.

Это не относится к общему вопросу, но работает для конкретного приведенного вами примера.

std::cout << " \n"[(bool)(p - 1)];

Объяснение:

Во-первых, строковый литерал (такой как " \n") является массивом. Как таковой, он участвует в затухании указателя и может быть проиндексирован, как и любой другой указатель или массив.

Во-вторых, целое число может быть преобразовано в bool, и преобразование имеет специальное свойство, в которое конвертируется ноль. falseи все остальное преобразуется в true, Поэтому, когда я вычесть 1 из p, а затем преобразовать его в bool, это false если p 1 и true иначе.

В-третьих, bool может быть (неявно) преобразован обратно в целое число. false конвертируется в 0 и true конвертирует в 1. Таким образом, преобразование из int в bool и обратно приводит к тому, что 0 остается 0, а все остальное становится 1.

Итак, с учетом этих трех моментов, выражение:

" \n"[(bool)(p - 1)]

приводит к одной из этих двух возможностей:

" \n"[0]      // a space (if p == 1)
" \n"[1]      // or a newline (if p != 1)

Я бы понизил этот ответ, если бы мог.

cout << [=]{ if (p == 1) return " "; else return "\n"; }();

В основном: нет, это невозможно сделать:

cout << if (p == 1) " " else "\n";

Это именно цель ?: оператор - это дает значение. Некоторые вещи могут быть невозможны с if-else синтаксис. Пример: условная инициализация. Рассматривать:

if(p == 1)
    int value = 1; //local variable!
else
    int value = 0; //and so is this one!

//here 'value' is unknown

Выше проблема может быть решена следующим образом:

int value; //default initialization

if(p == 1)
    value = 1; //assignment to already initialized variable!
else
    value = 0; //and so is this!

Но эти два не равны. Для некоторых типов это может привести к совершенно другому поведению, потому что инициализация отличается от присваивания. ?: это решение:

int value == (p == 1) ? 1 : 0; //'value' is initialized with value, that depends on 'p'

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

Другие вопросы по тегам