Как написать одну строку и вложенный оператор 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) " " 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'
Не пытайтесь делать вещи без инструментов, которые были разработаны, чтобы сделать это для вас.