C面试考试的“条件”是什么?

What's the "condition" in C interview test?

提问人:ryan 提问时间:8/29/2008 最后编辑:crackerryan 更新时间:12/23/2015 访问量:11835

问:

是否可以使用单个打印两次?Hellocondition

if  "condition"
  printf ("Hello");
else
  printf("World");
c 条件语句

评论

0赞 user215968 11/21/2009
我的意思是,如果我们想在两个块中执行代码,那么处于“if”状态的代码应该是什么?
5赞 Greg Hewgill 11/21/2009
这是一个愚蠢的伎俩问题。问题可能更像是这样的:stackoverflow.com/questions/33199/......答案就在那里。
17赞 Laurence Gonsalves 11/21/2009
答案是:你不想在问这样愚蠢问题的地方工作。
2赞 mlibby 11/21/2009
重复?我认为不是!“副本”中的大多数答案并不像这里的答案那么有趣。部分原因是问题完全不同。在这里,我们想要执行两个分支,在另一个问题中,要求是创建一个导致特定输出的条件。截然不同的问题,答案也截然不同。一个是测试你对类似goto结构的了解,另一个是测试你对条件下副作用的认识。
0赞 ceejayoz 8/29/2008
http://www.geekinterview.com/question_details/65997

答:

5赞 Greg Hewgill 8/29/2008 #1

该语句执行一个或另一个受控语句(在您的示例中均为受控语句)。无论您使用什么,该代码段都会打印“Hello”或“World”,但绝不会同时打印两者。ifprintfcondition

编辑:好的,所以这是一个技巧问题,你可以把你喜欢的任何内容放在条件中(包括调用整个其他函数,做任何你想做的事)。但这并不有趣。我简直不敢相信我因为给出了正确的答案而被贬低了。

评论

3赞 freespace 9/22/2008
我也不敢相信,在我看来,无论谁这样做都是小气/蹩脚的。所以这里有一些代表:)不应该因为不够“聪明”而看到解决方案并发布你真正认为正确的内容而受到负面惩罚。
5赞 scoob 8/29/2008 #2
if ( printf("Hello")==0)

看 [http://www.coders2020.com/what-does-printf-return]

(matt纠正了我的=,谢谢,C很远)

0赞 Jake Pearson 8/29/2008 #3
if(printf("Hello") == 1)
    printf("Hello")
else
    printf("World")
85赞 Matt Dillard 8/29/2008 #4
if ( printf("Hello") == 0 )
    printf ("Hello");
else
    printf ("World");

:-)

评论

2赞 Lesswire 1/5/2015
对于 printf:成功后,将返回写入的字符总数。
2赞 travis 8/29/2008 #5
if  (true) printf ("Hello"); if (false)
    printf ("Hello");
else
    printf("World");
21赞 Frank Krueger 8/29/2008 #6
"condition" === (printf("Hello"), 0)

真的很蹩脚:

int main() {
    if  (printf("Hello"), 0)
        printf ("Hello");
    else
        printf("World");
}

我更喜欢使用逗号运算符,因为您不必查找 的返回值即可知道条件的作用。这提高了可读性和可维护性。:-)printf

1赞 Daren Thomas 8/29/2008 #7

这可能起作用:

if (printf("Hello") - strlen("Hello"))
    printf("Hello")
else
    printf("World")

此代码段强调 的返回值 : 打印的字符数。printf

0赞 Billy Jo 8/29/2008 #8
if (printf("Hello") < 1)
    printf("Hello");
else
    printf("World");
6赞 user3458 8/29/2008 #9
#define CONDITION (0) if (0) {} else

或类似的东西。

如果你在面试中看到这样的问题,请尽快逃跑!提出此类问题的团队注定是不健康的。

编辑 - 我忘了澄清 - 这依赖于“else”与最接近的打开“if”匹配,并且它被写成“if CONDITION”而不是 if (CONDITION) - 括号会使难题无法解决。

0赞 infralite 8/29/2008 #10

格雷格写道:

无论您使用什么条件,该代码段都会打印“Hello”或“World”,但绝不会同时打印两者。

好吧,这不是真的,但是为什么你希望它同时打印两者,我找不到用例。它破坏了 if 语句的意义。可能的“真正”解决方案是根本不使用 if。愚蠢的面试问题... :)

0赞 ryan 8/29/2008 #11

非常有趣的家伙,谢谢你的回答。我从来没有想过将打印语句放在 if 条件中。

下面是 Java 的等效项:

    if ( System.out.printf("Hello").equals("") )
        System.out.printf("Hello");
    else
        System.out.printf("World");
3赞 Rodney 8/29/2008 #12

不知道 off the top of your head 的返回值:printf

if (printf("Hello") && 0)
    printf("Hello");
else
    printf("World");
11赞 GowriKumar 9/17/2008 #13

如果它在 Unix 上:

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

Ofcoures 不保证订单 0f 打印件

1赞 Fazil 4/24/2009 #14

解决方案 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;
}
2赞 Johannes Schaub - litb 9/3/2009 #15

没有爱?exit

if(printf("HelloWorld"), exit(0), "ByeBye") 
    printf ("Hello");
else
    printf ("World");
0赞 Adriaan Stander 11/21/2009 #16

然后不要使用 if else 块。

编辑以注释。

然后,这可能意味着代码位于两个块中,或者如果在这两种情况下都需要运行,则代码位于块之前/之后。

评论

0赞 user215968 11/21/2009
如果我们想在两个块中执行代码,那么处于“if”状态的代码应该是什么?
2赞 Ed S. 11/21/2009 #17

所以。。。您想执行 if 块中的代码...以及 else 块中的代码......相同的 if/else 语句?然后。。。您应该删除 else 并将该代码粘贴在 if 中。

if something
  do_this
  do_that
end

else 语句被设计为仅在未执行 if 语句时执行,反之亦然,这就是重点。这是一个奇怪的问题......

1赞 Michael Stum 11/21/2009 #18

只需将代码放在 if 之前或之后。else 块。

或者,如果你有一个“if, else if, else”块,你想在某些(但不是全部)分支中执行代码,只需把它放在一个单独的函数中,并在每个块中调用该函数。

3赞 Tordek 11/21/2009 #19

注释“else”;)

if(foo)
{
    bar();
}
//else
{
    baz();
}

评论

0赞 fastcodejava 11/21/2009
很好的答案!善用评论。
13赞 Eli Bendersky 11/21/2009 #20

系好安全带:

#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

你是这个意思吗?我对此表示怀疑,但至少这是可能的。使用 you 也可以这样做,但分支将在不同的进程中运行。fork

评论

1赞 Jonathan Leffler 11/21/2009
注意:您不能以可移植方式分配 setjmp() 宏的返回值。
0赞 Eli Bendersky 11/21/2009
@jonathan - 你是对的,修复了代码。但是,我想知道现在是否有任何编译器无法正确处理它。许多基于 setjmp 的 C“异常”框架使用其保存到标志的返回值
0赞 Jonathan Leffler 11/21/2009
在实践中,它可能有效;我当然不知道哪个平台不起作用 - 但我也没有调查过,因为调试故障会很痛苦(充其量)。分配 的返回值是未定义的行为;任何事情都可能发生(包括“它按预期或期望工作”)。setjmp()
17赞 sud03r 11/21/2009 #21

在我看来,这听起来像是一些面试难题。我希望这接近你想要的。


#include <stdio.h>

int main()
{
 static int i = 0 ;
 if( i++==0 ? main(): 1)
  printf("Hello,");
 else
  printf("World\n");

 return 0 ;
}

指纹Hello, World

评论

1赞 Javi Ortiz 9/3/2014
我认为这应该是公认的答案。它不使用分叉,因此订单是有保证的,也不会在条件中打印“Hello”。执行实际上进入了两个决策分支......否则,您可以打印条件中的所有内容,然后结束程序,我认为这不是一个非常聪明的解决方案!
0赞 rtpg 11/21/2009 #22

使用 goto,这是我们这个时代最未被充分利用的关键字之一

评论

1赞 Matthew 11/21/2009
正如 Dijkstra 和其他人所提到的,很可能是最危险的之一。
1赞 Steve Jessop 11/22/2009
Goto 并不像数组取消引用运算符那样危险。
3赞 Jonathan Leffler 11/21/2009 #23

基本的答案是,在正常的事件过程中,你既不想在一次代码传递中同时执行“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;
    }

评论

0赞 Jonathan Leffler 11/21/2009
代码的“更邪恶”版本反转了标签(因此“then”子句有一个标签“Else”,反之亦然)。也许邪恶的“终极”坚持以相同的顺序执行代码块,而不管条件的结果如何(当然,这是可以做到的)。但是这些要求变得如此牵强,以至于荒谬可笑——如果它们还没有的话!
1赞 12/17/2010
就我认为他要求一个条件,而不是声明中的“goto”而言,在我看来违反了这条规则
3赞 Dustin E 11/21/2009 #24
int main()
{
    runIfElse(true);
    runIfElse(false);

    return 0;
}

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

评论

0赞 Jonathan Leffler 11/21/2009
目前尚不清楚“运行”的问题是什么意思,是吗?+1 以不同的方式歪曲问题。
0赞 lpz 11/21/2009 #25

Cheeting 使用空的 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;
    }
}
0赞 firesofmay 4/14/2012 #26

不使用 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"); 
}
}

参考 :- Link1Link2

-2赞 mafia 8/22/2012 #27

这个问题的条件是:

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

评论

0赞 mafia 8/22/2012
if(printf(“hello”)? 0 : 1) {} else printf(“world”);
0赞 shiju 8/29/2014 #28
if (printf("hello") & 0)
{
printf("hello");
}
else
{
printf("world");

无需为printf的返回值而烦恼。

1赞 Shankha Jana 5/2/2015 #29
 #include<stdio.h>
  int main()
{
 if(! printf("Hello"))
     printf ("Hello");
else
    printf ("World");
 return 0;
}

因为 Printf 返回它已成功打印的字符数。

0赞 Michael Dorgan 5/2/2015 #30

滥用预处理 - 至少进行清理。


#define else 
if(1)
{
   printf("hello");
}
else
{
   printf("world");
}
#undef else