Каковы «условия» в тесте на собеседование C?

Можно ли напечатать Hello дважды, используя один condition?

if  "condition"
  printf ("Hello");
else
  printf("World");

Я имею в виду, каким должен быть код в условии «если», если мы хотим выполнить код в обоих блоках?

user215968 21.11.2009 09:13

Покажите код, чтобы мы могли его посмотреть.

Adriaan Stander 21.11.2009 09:16

@Michael Этот вопрос был задан для интервью, я сказал то же самое ... но парень с другой стороны сказал, что вы можете сделать это на C.

user215968 21.11.2009 09:17

Это глупый вопрос с подвохом. Вопрос, наверное, был больше такой: stackoverflow.com/questions/33199/… и ответы есть.

Greg Hewgill 21.11.2009 09:22

Ответ: вы не хотите работать там, где задают подобные глупые вопросы.

Laurence Gonsalves 21.11.2009 09:33

Я хотел бы, чтобы кто-нибудь объяснил мне, почему это отклонено и должно быть закрыто? потому что это не очень хороший вопрос для собеседования? с каких это пор мы ТАКИЕ снобы?

Eli Bendersky 21.11.2009 11:19

@eliben - ясно сказано, что он был закрыт как «точный дубликат» - со ссылкой на возможный вопрос, который задает нечто подобное.

LiraNuna 21.11.2009 11:25

Дубликат? Думаю, нет! Большинство ответов в «дубликате» не так интересны, как ответы здесь. Отчасти потому, что вопрос в совершенно разные. Здесь мы хотим выполнить обе ветви, в другом вопросе требовалось создать условие, которое вызвало определенный вывод. Очень разные вопросы с очень разными ответами. Один из них - это проверка ваших знаний о конструкциях типа goto, другой - проверка вашей осведомленности о побочных эффектах в определенных условиях.

mlibby 21.11.2009 15:47

Что касается бонусных оценок, делайте это в соответствии со стандартами кодирования MISRA C.

Craig McQueen 28.11.2010 14:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
31
10
11 337
30
Перейти к ответу Данный вопрос помечен как решенный

Ответы 30

Оператор if выполняет один или другой из контролируемых операторов (оба printf в вашем примере). Независимо от того, что вы используете для condition, этот фрагмент будет выводить либо «Hello», либо «World», но не то и другое одновременно.

Обновлено: Хорошо, это вопрос с подвохом, и вы можете поместить в условие все, что захотите (включая вызов целой другой функции, которая делает все, что вы хотите). Но это вряд ли интересно. Не могу поверить, что меня обидели за то, что я дал правильный ответ.

Я тоже не могу поверить в это, тот, кто это сделал, на мой взгляд, был мелочным / хромым. Итак, вот репутация :) Не должно быть отрицательных штрафов за то, что вы недостаточно «умны», чтобы увидеть решение и опубликовать то, что вы действительно считали правильным.

freespace 22.09.2008 17:39

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: в случае успеха возвращается общее количество записанных символов.

Lesswire 05.01.2015 15:52

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.

ИЗМЕНИТЬ в комментарий.

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

каким должен быть код в условии «если», если мы хотим выполнить код в обоих блоках ??

user215968 21.11.2009 09:15

Итак ... вы хотите выполнить код внутри блока 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();
}

Отличный ответ! Хорошее использование комментария.

fastcodejava 21.11.2009 10:55

Пристегните ремни безопасности:

#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 Leffler 21.11.2009 09:49

@jonathan - ты прав, исправил код. Однако мне интересно, есть ли в наши дни какой-нибудь компилятор, который не справляется с этим правильно. Многие "исключительные" фреймворки C, основанные на setjmp, используют его возвращаемое значение, сохраненное во флаге.

Eli Bendersky 21.11.2009 09:54

На практике это, вероятно, работает; Я, конечно, не знаю платформы, на которой это не работает, но я тоже не исследовал, потому что отладка сбоя была бы болезненной (в лучшем случае). Назначение возвращаемого значения setjmp() является неопределенным поведением; может случиться что угодно (включая «это работает, как ожидалось или желательно»).

Jonathan Leffler 21.11.2009 10:13

Для меня это звучит как загадка для интервью. Надеюсь, это близко к тому, что вы хотите.


#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» в условии. Выполнение фактически входит в две ветви решений ... В противном случае вы могли бы распечатать все в условии, а затем завершить программу, я думаю, что это не очень умное решение!

Javi Ortiz 03.09.2014 15:34

используйте goto, одно из самых редко используемых ключевых слов в наши дни

И, возможно, один из самых опасных, как упоминали Дейкстра и другие.

Matthew 21.11.2009 10:57

goto не так опасен, как оператор разыменования массива.

Steve Jessop 21.11.2009 22:00

Основной ответ заключается в том, что при обычном ходе событий вы не хотите выполнять оба оператора в блоке 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» и наоборот). И, возможно, «крайний» зла настаивает на том, чтобы блоки кода выполнялись в одном и том же порядке независимо от результата условия (что, конечно, может быть выполнено). Но требования тогда становятся настолько надуманными, что могут показаться нелепыми - если бы их еще не было!

Jonathan Leffler 21.11.2009 10:17

Насколько я думаю, он попросил условие, а не "goto" в заявлении, нарушил это правило в моем понимании.

user379888 17.12.2010 10:01

int main()
{
    runIfElse(true);
    runIfElse(false);

    return 0;
}

void runIfElse(bool p)
{
    if (p)
    {
     // do if
    }
    else
    {
     // do else
    }
}

Непонятно, что означает вопрос под словом «беги»? +1 за искажение вопроса по-другому.

Jonathan Leffler 21.11.2009 09:56

Мошенничество с пустым оператором 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"); 
}
}

Ссылка: - Link1, Link2

Условие ответа на этот вопрос:

 if (printf("hello")? 0 : 1) {   }

если (printf ("привет")? 0: 1) {} else printf ("мир");

mafia 21.08.2012 21:40

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

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