【问题标题】:Condition that is true and false at the same time in C or Java [duplicate]C或Java中同时为真和假的条件[重复]
【发布时间】:2011-05-16 08:09:36
【问题描述】:

可能重复:
What's the “condition” in C interview question?

这样的事情可以做吗?

代码:

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

结果:Hello World

应该使用什么条件来使这成为可能?

请帮忙。提前致谢。

【问题讨论】:

  • 如果您的编译器编译了该代码,您的虚拟机当然会打印“Hello World”。
  • 不,你在 ... else{ printf("World") } ;
  • 这可能是我一个月来第三次看到这个问题了。
  • 这是我见过的前 3 个 stupidest 面试问题之一(其他问题是“你如何更改 const-qualified 变量的值”和“在不使用 _______ 控制结构的情况下,你如何 _______?”)如果你在面试中被认真地问到这个问题,逃跑;你不想在那里工作。

标签: java c if-statement


【解决方案1】:

一般来说,不,这是不可能的。 if/else 被转换为 Java 字节码(以及在任何一种情况下,转换为机器码)的方式,一个进程将运行语句的两个分支中的一个。如果我们没有 if/else,我们最终会使用 goto 来合成它,这看起来很像这样:

  if (condition) goto if_block;

else_block:
  printf("World");
  goto after_ifelse;

if_block:
  printf("Hello");

after_ifelse:

如您所见,如果条件为真(即使它也可能为假!),该过程将遵循“if”分支并跳过另一个。没有办法在一个过程中解决这个问题。任何方式都需要更改程序的代码,或损坏的硬件(尤其是 RAM 或 CPU),或足以杀死你的辐射。我所知道的每个编译器和环境都以这种方式对待if/else,尽管在if 之后有else 的情况很常见(并反转条件),这使得(非常有效)假设任何布尔条件都是不真就是假。

现在说了这么多……在 C 语言中,这是半可能的,但不是你想的那样——也不是在每个操作系统上。在 *nix 系统上,有一个通常称为 fork() 的系统调用,它允许一个进程变为两个(从而回避“一个进程将只运行一个分支”的限制)。

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

但是 (1) 这段代码有一个固有的竞争条件——两个分支现在都设置为运行,但任何一个都可以在另一个之前运行。您需要在子进程上wait。 (2) 这不是“条件”,而是函数调用。如果您不允许添加代码,那么这不应该作为答案。

或者你可以做一些邪恶的宏指令来将else 完全翻译成别的东西。但是以后阅读您的代码的任何人都会想追捕您并没收您的键盘,如果他们很好的话。

【讨论】:

    【解决方案2】:

    讲师希望您填写fork() 作为条件。这不是一般的 C 代码,而是 Unix/POSIX 代码,它通过将进程拆分为父进程和子进程来工作。 fork 在父进程中返回子进程 id(非零数字,因此 true),在子进程中返回 0 (false)。

    如果您可以在其他地方添加代码,另一种解决问题的潜在方法是将setjmp(jmp_buf) 作为条件,并在条件后添加longjmp(jmp_buf, 1);。然而这似乎打破了问题的规则。

    【讨论】:

    • 当然,要绝对得到HelloWorld作为输出,你需要使用!fork() || wait() && 0作为条件。
    【解决方案3】:

    您描述的功能看起来更像switch 结构。

    在 Java 中,您只能打开 intenum 类型,但在 C 中,您可以打开字符串以及 int 类型。

    应该是这样的:

    int i = 0;
    
    switch (i) {
        case 0:
             System.out.print("Hello ");
        case 1:
             System.out.print("World!");
             break;
      }
    

    结果输出将是“Hello World!”

    i0 时,它匹配第一个case 并执行代码,直到找到下一个break; 语句。如果i1,它只会打印出“World!”。

    【讨论】:

      【解决方案4】:

      两种语言中的布尔类型变量都不允许允许你做你想做的事。关键是它们必须是其中之一。

      要完成你想要的,你可能需要一个自定义类型。

      //This type allows for quantum weirdness
      public class NotABool{
      
          public boolean isTrue = false;
          public boolean isFalse = false;
      
          //Funky setMethod
          void set(boolean value){
             //...
          }
      }
      
      NotABool nab = new NotABool();
      
      if (NotABool.isTrue){
         //Print "Hello"
      }
      if (NotABool.isFalse){
         //Print "World"
      }
      

      您能说明一下您要完成的工作吗?

      【讨论】:

      • 好的,我明白了。只是我的老师告诉我,我问的事情是可能的,使用一个条件。
      • ,但我必须想办法做到这一点。感谢您的回答。对不起我的英语:p
      • @lucas 这两种语言都不可能。你能写出误导性的代码让它看起来像它吗? yes. 那里可能存在允许这样做的编译器错误? unlikely. 这是允许的吗? Definitely not.
      • @Lucas:你的老师对你造成了极大的伤害。在可能的情况下,这可能是由于编译器错误或特定于平台的细节(如fork())或其他在课堂上没有位置的鬼鬼祟祟的技巧。如果他教你编写 *nix 代码,那么他应该以不同的方式表述问题/问题;事实上,听起来他只是个不了解 if/else 目的的黑客。
      • +1 到he's doing you a disservice
      【解决方案5】:

      这很疯狂,但是:

      int test = 0;
      String s = "";
      
      switch (test) {
          case 0: s += "Hello";
          default: s += "World";
      }
      
      System.out.println(s);
      

      【讨论】:

      • 没有。詹姆斯的回答很疯狂。你的不是。
      • bool -> int 转换(考虑到 0 是 True :))为此目的是相当奢侈的.. 至少;但是谢谢:)
      • 这一点也不疯狂,但这根本不是问题所要问的。你根本不使用 if/else。
      【解决方案6】:

      我脑海中唯一的想法是这样的

      if (printf("Hello") > 0)
        printf("");
      else
        printf(" world");
      

      但这不是一回事,你不能执行 if/else 的两个分支:选择两个分支之一。

      【讨论】:

        【解决方案7】:

        你可以作弊以在 C 中得到这个结果:

        #include <stdio.h>
        #define else printf(" ");
        
        int main()
        {
            int condition = 1;
            if(condition) { 
                printf("Hello");
            } 
            else { 
                printf("World");
            }
        }
        

        输出:

        Hello World
        

        【讨论】:

        • 那是肮脏、肮脏、糟糕的巫术。不是你想在生产中做的事情。但这是一个有效的答案。
        • 这真的是合法的C吗?我知道 C++ 标准禁止重新定义键盘,即使它适用于大多数编译器。
        • @DaVinci:据我所知,这是有效的 C。在 C 中,在包含标准库头文件之前,不允许定义名称与关键字词法相同的宏。只要您在包含所有标准库标头之后定义宏,就可以了。 (C++ 有更严格的规则,即您不能在包含任何标准库标头的任何翻译单元中的任何位置定义一个名称与词法相同的关键字的宏。
        • 嗯?这到底是怎么回事? ...哦,好的,我刚看到它Smarty Pants先生,您至少应该解释并指出您已将“else”定义为文件顶部的宏,它覆盖了“else”的正常用法,并打印出一个空格。这个答案肯定会让新用户感到困惑,所以我建议显示扩展版本,并在原始版本下方替换为“else”。
        • 如果这让任何人在真正看到#define 后感到困惑,那么他们一开始就不应该查看这段代码
        【解决方案8】:

        不,声明是if ... else,而不是if ... and then also maybe。条件被评估一次,然后选择分支。

        【讨论】:

          【解决方案9】:

          if/elses 是非此即彼。要么执行 if 部分,要么执行 else,但绝不会同时执行。

          【讨论】:

            【解决方案10】:

            没有。

            else 语句将if 没有执行的情况下执行。

            【讨论】:

            • 这里有一些作弊,但这应该是唯一正确的答案。
            猜你喜欢
            • 2014-02-17
            • 1970-01-01
            • 2019-01-30
            • 2018-08-25
            • 1970-01-01
            • 1970-01-01
            • 2022-10-24
            • 2015-12-05
            • 2014-09-07
            相关资源
            最近更新 更多