Можно ли напечатать Hello дважды, используя один condition?
if "condition"
printf ("Hello");
else
printf("World");
Покажите код, чтобы мы могли его посмотреть.
@Michael Этот вопрос был задан для интервью, я сказал то же самое ... но парень с другой стороны сказал, что вы можете сделать это на C.
Это глупый вопрос с подвохом. Вопрос, наверное, был больше такой: stackoverflow.com/questions/33199/… и ответы есть.
Ответ: вы не хотите работать там, где задают подобные глупые вопросы.
Я хотел бы, чтобы кто-нибудь объяснил мне, почему это отклонено и должно быть закрыто? потому что это не очень хороший вопрос для собеседования? с каких это пор мы ТАКИЕ снобы?
@eliben - ясно сказано, что он был закрыт как «точный дубликат» - со ссылкой на возможный вопрос, который задает нечто подобное.
Дубликат? Думаю, нет! Большинство ответов в «дубликате» не так интересны, как ответы здесь. Отчасти потому, что вопрос в совершенно разные. Здесь мы хотим выполнить обе ветви, в другом вопросе требовалось создать условие, которое вызвало определенный вывод. Очень разные вопросы с очень разными ответами. Один из них - это проверка ваших знаний о конструкциях типа goto, другой - проверка вашей осведомленности о побочных эффектах в определенных условиях.
Что касается бонусных оценок, делайте это в соответствии со стандартами кодирования MISRA C.





Оператор if выполняет один или другой из контролируемых операторов (оба printf в вашем примере). Независимо от того, что вы используете для condition, этот фрагмент будет выводить либо «Hello», либо «World», но не то и другое одновременно.
Обновлено: Хорошо, это вопрос с подвохом, и вы можете поместить в условие все, что захотите (включая вызов целой другой функции, которая делает все, что вы хотите). Но это вряд ли интересно. Не могу поверить, что меня обидели за то, что я дал правильный ответ.
Я тоже не могу поверить в это, тот, кто это сделал, на мой взгляд, был мелочным / хромым. Итак, вот репутация :) Не должно быть отрицательных штрафов за то, что вы недостаточно «умны», чтобы увидеть решение и опубликовать то, что вы действительно считали правильным.
if ( printf("Hello")==0)
видеть [http://www.coders2020.com/what-does-printf-return]
(Мэтт поправил мой =, спасибо, C далеко)
if (printf("Hello") == 1)
printf("Hello")
else
printf("World")
if ( printf("Hello") == 0 )
printf ("Hello");
else
printf ("World");
:-)
Для printf: в случае успеха возвращается общее количество записанных символов.
if (true) printf ("Hello"); if (false)
printf ("Hello");
else
printf("World");
"condition" === (printf("Hello"), 0)
Действительно хромой:
int main() {
if (printf("Hello"), 0)
printf ("Hello");
else
printf("World");
}
Я предпочитаю использовать оператор запятой, потому что вам не нужно искать возвращаемое значение printf, чтобы узнать, что делает условное выражение. Это увеличивает удобочитаемость и ремонтопригодность. :-)
Это могло сработать:
if (printf("Hello") - strlen("Hello"))
printf("Hello")
else
printf("World")
Этот фрагмент подчеркивает возвращаемое значение printf: количество напечатанных символов.
if (printf("Hello") < 1)
printf("Hello");
else
printf("World");
#define CONDITION (0) if (0) {} else
или что-то в этом роде.
Если вы видите такой вопрос на собеседовании, убегайте как можно быстрее! Команда, которая задает такие вопросы, обязательно будет нездоровой.
Изменить - я забыл уточнить - это зависит от того, что "else" сопоставляется с ближайшим открытым "if", и на том факте, что оно написано как "if CONDITION", а не if (CONDITION) - скобки сделают головоломку неразрешимой.
Greg wrote:
No matter what you use for condition, that snippet will either print "Hello", or "World", but never both.
Ну, это неправда, но зачем вам хотеть печатать и то, и другое, я не могу найти варианта использования. Это лишает смысла использование оператора if. Вероятно, «настоящее» решение - вообще не использовать if. Глупые вопросы на собеседовании ... :)
Очень интересные ребята, спасибо за ответы. Я никогда бы не подумал о том, чтобы поместить оператор печати в условие if.
Вот эквивалент в Java:
if ( System.out.printf("Hello").equals("") )
System.out.printf("Hello");
else
System.out.printf("World");
Не зная, какое возвращаемое значение printf у вас в голове:
if (printf("Hello") && 0)
printf("Hello");
else
printf("World");
Если это в Unix:
if (fork())
printf ("Hello");
else
printf("World");
Конечно, это не гарантирует порядок отпечатков.
Решение 1:
int main(int argc, char* argv[])
{
if ( argc == 2 || main( 2, NULL ) )
{
printf("Hello ");
}
else
{
printf("World\n");
}
return 0;
}
Решение 2 (только для Unix и Linux):
int main(int argc, char* argv[])
{
if ( !fork() )
{
printf("Hello ");
}
else
{
printf("World\n");
}
return 0;
}
Нет любви к exit?
if (printf("HelloWorld"), exit(0), "ByeBye")
printf ("Hello");
else
printf ("World");
Тогда не используйте блок if else.
ИЗМЕНИТЬ в комментарий.
Тогда это может означать, что код находится в обоих блоках или до / после блока, если он требуется для выполнения в обоих случаях.
каким должен быть код в условии «если», если мы хотим выполнить код в обоих блоках ??
Итак ... вы хотите выполнить код внутри блока if ... и код внутри блока else ... того же оператора if / else? Тогда ... вам следует избавиться от else и вставить код taht в if.
if something
do_this
do_that
end
Оператор else предназначен для выполнения только в том случае, если оператор if не выполняется, и наоборот, в этом весь смысл. Странный вопрос ...
Просто поместите код до или после блока if..else.
В качестве альтернативы, если у вас есть блок «if, else if, else», в котором вы хотите выполнять код в некоторых (но не во всех) ветках, просто поместите его в отдельную функцию и вызовите эту функцию в каждом блоке.
Прокомментируйте "else";)
if (foo)
{
bar();
}
//else
{
baz();
}
Отличный ответ! Хорошее использование комментария.
Пристегните ремни безопасности:
#include <stdio.h>
#include <setjmp.h>
int main()
{
jmp_buf env;
if (!setjmp(env))
{
printf("if executed\n");
longjmp(env, 1);
}
else
{
printf("else executed\n");
}
return 0;
}
Печать:
if executed
else executed
Это то, что вы имеете в виду? Сомневаюсь, но, по крайней мере, это возможно. Используя fork, вы тоже можете это сделать, но ветки будут выполняться в разных процессах.
Осторожно: вы не можете перенести возвращаемое значение из макроса setjmp ().
@jonathan - ты прав, исправил код. Однако мне интересно, есть ли в наши дни какой-нибудь компилятор, который не справляется с этим правильно. Многие "исключительные" фреймворки C, основанные на setjmp, используют его возвращаемое значение, сохраненное во флаге.
На практике это, вероятно, работает; Я, конечно, не знаю платформы, на которой это не работает, но я тоже не исследовал, потому что отладка сбоя была бы болезненной (в лучшем случае). Назначение возвращаемого значения setjmp() является неопределенным поведением; может случиться что угодно (включая «это работает, как ожидалось или желательно»).
Для меня это звучит как загадка для интервью. Надеюсь, это близко к тому, что вы хотите.
#include <stdio.h>
int main()
{
static int i = 0 ;
if ( i++==0 ? main(): 1)
printf("Hello,");
else
printf("World\n");
return 0 ;
}
печатает Hello, World
Я думаю, это должен быть принятый ответ. Он не использует вилки, поэтому порядок гарантирован, а также не печатает «Hello» в условии. Выполнение фактически входит в две ветви решений ... В противном случае вы могли бы распечатать все в условии, а затем завершить программу, я думаю, что это не очень умное решение!
используйте goto, одно из самых редко используемых ключевых слов в наши дни
И, возможно, один из самых опасных, как упоминали Дейкстра и другие.
goto не так опасен, как оператор разыменования массива.
Основной ответ заключается в том, что при обычном ходе событий вы не хотите выполнять оба оператора в блоке if и блок else за один проход через код (зачем беспокоиться об условии, если вы это делаете), и не можете вы выполняете оба набора утверждений, не прыгая через гротескные обручи.
Гротескные обручи - злой кодекс!
if (condition == true)
{
...stuff...
goto Else;
}
else
{
Else:
...more stuff...
}
Конечно, это явное злоупотребление (любым) языком, потому что это эквивалентно:
if (condition == true)
{
...stuff...
}
...more stuff...
Однако он может достичь того, о чем спрашивается. Если вам нужно выполнить оба блока, независимо от того, истинно ли условие или ложно, тогда все становится немного сложнее.
done_then = false;
if (condition == true)
{
Then:
...stuff...
done_then = true;
goto Else;
}
else
{
Else:
...more stuff...
if (!done_then) goto Then;
}
В «еще более злой» версии кода метки меняются местами (поэтому предложение then имеет метку «Else» и наоборот). И, возможно, «крайний» зла настаивает на том, чтобы блоки кода выполнялись в одном и том же порядке независимо от результата условия (что, конечно, может быть выполнено). Но требования тогда становятся настолько надуманными, что могут показаться нелепыми - если бы их еще не было!
Насколько я думаю, он попросил условие, а не "goto" в заявлении, нарушил это правило в моем понимании.
int main()
{
runIfElse(true);
runIfElse(false);
return 0;
}
void runIfElse(bool p)
{
if (p)
{
// do if
}
else
{
// do else
}
}
Непонятно, что означает вопрос под словом «беги»? +1 за искажение вопроса по-другому.
Мошенничество с пустым оператором else:
if (condition)
// do if stuff
else;
// do else stuff
Если вам не нравится, что elsa; на самом деле пустой оператор else, попробуйте следующее:
for (int ii=0; ii<2; ii++)
{
if (condition && !ii)
// do if stuff
else
{
// do else stuff
break;
}
}
Два возможных решения без использования операторов printf: -
Первый :-
#include <stdio.h>
int
main(void)
{
if (!stdin || (stdin = 0, main()))
printf("hello");
else
printf("world");
return 0;
}
Второй
#include<stdio.h>
void main()
{
if (1
#define else if (1)
)
{
printf("hello");
}
else
{
printf("world");
}
}
Условие ответа на этот вопрос:
if (printf("hello")? 0 : 1) { }
если (printf ("привет")? 0: 1) {} else printf ("мир");
if (printf("hello") & 0)
{
printf("hello");
}
else
{
printf("world");
Не нужно беспокоиться о возвращаемом значении printf.
#include<stdio.h>
int main()
{
if (! printf("Hello"))
printf ("Hello");
else
printf ("World");
return 0;
}
Поскольку Printf возвращает количество успешно напечатанных символов.
Злоупотребление препроцессингом - как минимум с очисткой.
#define else
if (1)
{
printf("hello");
}
else
{
printf("world");
}
#undef else
Я имею в виду, каким должен быть код в условии «если», если мы хотим выполнить код в обоих блоках?