Можно ли написать одну строку if-else
заявление (то есть, используя только один ;
) без с использованием ?:
выражение? Например что-то в форме:
if (p == 1) " " else "\n";
Потенциальная цель может быть:
cout << if (p == 1) " " else "\n";
Просто любопытно, если это возможно, не знаю, есть ли практические применения для этого.
Спасибо
Вы уже использовали два важных слова, которые являются ключевыми, чтобы понять, почему то, что вы намереваетесь, невозможно, но вы, вероятно, не поняли их полное значение: утверждение а также выражение.
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'
Не пытайтесь делать вещи без инструментов, которые были разработаны, чтобы сделать это для вас.