Каково “условие” в тесте C interview?
-
09-06-2019 - |
Вопрос
Можно ли было бы распечатать Hello
дважды используя один condition
?
if "condition"
printf ("Hello");
else
printf("World");
Решение
if ( printf("Hello") == 0 )
printf ("Hello");
else
printf ("World");
:-)
Другие советы
"condition" === (printf("Hello"), 0)
Действительно отстойно:
int main() {
if (printf("Hello"), 0)
printf ("Hello");
else
printf("World");
}
Я предпочитаю использовать оператор запятой, потому что вам не нужно искать возвращаемое значение printf
для того, чтобы знать, что делает условное выражение.Это повышает читабельность и ремонтопригодность.:-)
Для меня это звучит как какая-то головоломка для интервью.Я надеюсь, что это близко к тому, что вы хотите.
#include <stdio.h>
int main()
{
static int i = 0 ;
if( i++==0 ? main(): 1)
printf("Hello,");
else
printf("World\n");
return 0 ;
}
С принтами Hello, World
Пристегните ремни безопасности:
#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
вы тоже можете это сделать, но ветви будут выполняться в разных процессах.
Если это в Unix:
if (fork())
printf ("Hello");
else
printf("World");
Варианты, которые не гарантируют порядок отпечатков
#define CONDITION (0) if (0) {} else
или что-то в этом роде.
Если вы увидите такой вопрос на собеседовании, убегайте как можно быстрее!Команда, которая задает такие вопросы, обречена на нездоровье.
Редактировать - я забыл уточнить - это зависит от того, что "else" сопоставляется с ближайшим открытым "if", и от того факта, что оно написано как "if CONDITION", а не if (УСЛОВИЕ) - скобки сделали бы головоломку неразрешимой.
if ( printf("Hello")==0)
видеть [http://www.coders2020.com/what-does-printf-return ]
(мэтт исправил мое =, спасибо, C далеко)
Тот Самый if
оператор выполняет один или другой из контролируемых операторов (оба printf
в вашем примере).Независимо от того, для чего вы используете condition
, этот фрагмент будет печатать либо "Hello", либо "World", но никогда оба сразу.
Редактировать:Итак, это вопрос с подвохом, и вы можете поместить в условие все, что вам нравится (включая вызов совершенно другой функции, которая делает все, что вы хотите).Но вряд ли это интересно.Я не могу поверить, что меня осудили за то, что я дал правильный ответ.
Прокомментируйте "остальное" ;)
if(foo)
{
bar();
}
//else
{
baz();
}
Не зная возвращаемого значения printf
навскидку с твоей головы:
if (printf("Hello") && 0)
printf("Hello");
else
printf("World");
Основной ответ заключается в том, что при обычном ходе событий вы не хотите выполнять оба оператора в блоке "if" и блоке "else" за один проход по коду (зачем беспокоиться об условии, если вы это делаете), и вы не можете выполнить оба набора операторов, не перепрыгивая через гротескные обручи.
Какие-то гротескные обручи - злой код!
if (condition == true)
{
...stuff...
goto Else;
}
else
{
Else:
...more stuff...
}
Конечно, это простое злоупотребление (любым) языком, потому что это эквивалентно:
if (condition == true)
{
...stuff...
}
...more stuff...
Однако это могло бы привести к тому, о чем говорится в вопросе.Если вам нужно выполнить оба блока, независимо от того, является условие true или false, тогда все становится немного сложнее.
done_then = false;
if (condition == true)
{
Then:
...stuff...
done_then = true;
goto Else;
}
else
{
Else:
...more stuff...
if (!done_then) goto Then;
}
int main()
{
runIfElse(true);
runIfElse(false);
return 0;
}
void runIfElse(bool p)
{
if(p)
{
// do if
}
else
{
// do else
}
}
if (true) printf ("Hello"); if (false)
printf ("Hello");
else
printf("World");
Никакой любви к exit
?
if(printf("HelloWorld"), exit(0), "ByeBye")
printf ("Hello");
else
printf ("World");
Итак...вы хотите выполнить код внутри блока if...и код внутри блока else...из того же оператора if / else?Затем...вы должны избавиться от else и вставить код taht в if.
if something
do_this
do_that
end
Оператор else предназначен для выполнения только в том случае, если оператор if не выполняется, и наоборот, в этом весь смысл.Это странный вопрос...
Это могло бы сработать:
if (printf("Hello") - strlen("Hello"))
printf("Hello")
else
printf("World")
В этом фрагменте подчеркивается возвращаемое значение printf
:Количество напечатанных символов.
Просто поместите код до или после блока if ..else.
В качестве альтернативы, если у вас есть блок "if, else if, else", в котором вы хотите выполнить код в некоторых (но не во всех) ветвях, просто поместите его в отдельную функцию и вызовите эту функцию внутри каждого блока.
Решение 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;
}
#include<stdio.h>
int main()
{
if(! printf("Hello"))
printf ("Hello");
else
printf ("World");
return 0;
}
Потому что Printf возвращает номер символа, который он успешно напечатал.
if(printf("Hello") == 1)
printf("Hello")
else
printf("World")
if (printf("Hello") < 1)
printf("Hello");
else
printf("World");
Грег написал:
Независимо от того, что вы используете для условия, этот фрагмент будет печатать либо "Hello", либо "World", но никогда оба сразу.
Ну, это неправда, но зачем тебе это делать хотеть я не могу найти вариант использования для того, чтобы напечатать и то, и другое.Это сводит на нет смысл наличия оператора if.Вероятное "реальное" решение - вообще не использовать if.Глупые вопросы для интервью...:)
Очень интересные ребята, спасибо за ответы.Я бы никогда не подумал о том, чтобы поместить оператор print в условие if.
Вот эквивалент Java:
if ( System.out.printf("Hello").equals("") )
System.out.printf("Hello");
else
System.out.printf("World");
Тогда не используйте блок if else.
ОТРЕДАКТИРУЙТЕ, чтобы прокомментировать.
Тогда это может означать, что код находится в обоих блоках или до / после блока, если он требуется для запуска в обоих случаях.
используйте goto, одно из самых недоиспользуемых ключевых слов нашего времени
Приветствие с пустым утверждением else:
if (condition)
// do if stuff
else;
// do else stuff
Если вам не нравится тот факт, что еще;на самом деле это пустое утверждение 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)
{
printf("hello");
}
else
{
printf("world");
Не нужно беспокоиться о возвращаемом значении printf .
Злоупотребление предварительной обработкой - по крайней мере, с очисткой.
#define else
if(1)
{
printf("hello");
}
else
{
printf("world");
}
#undef else
Условием для ответа на этот вопрос является:
if(printf("hello")? 0 : 1) { }