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

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

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

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

Спасибо

-9

Решение

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

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

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

3

Другие решения

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

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

14

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

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)

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

5

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

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

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'

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

1
По вопросам рекламы [email protected]