【问题标题】:Help with if-else in C Program [duplicate]C程序中的if-else帮助[重复]
【发布时间】:2011-03-29 04:23:27
【问题描述】:

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

void main()
{
         if(CONDITION)
               printf("Hello ");
         else
               printf("World");
}

将 CONDITION 替换为两个 printf 语句都被执行的条件。 main() 中不能有循环或其他东西 我在网上找到了这段代码,我试图思考它背后的逻辑,但我不能。 请帮帮我 谢谢

【问题讨论】:

  • 之所以叫 if / else 是有原因的
  • 这是作业吗?如果是这样,请标记它。
  • 您确定您的实现已将void main() 记录为有效吗?否则,这不是 C 程序。优先使用int main(),因为它在任何地方都有效。
  • 哈!这是一个非常好的问题。通过这种方式,您可以区分有经验的程序员和新手。我会复制那个。谢谢!
  • 我以为我已经看到这个问题并再次找到它:stackoverflow.com/questions/33199/…

标签: c


【解决方案1】:
CONDITION = printf("Hello") == 0;

【讨论】:

  • 对我来说毫无意义!?你改变了代码结构,这是预期的吗?
  • @rubberboots 他建议用这个表达式替换条件
【解决方案2】:

这有点像作弊但是......

void main()
{
         if (printf("Hello ") == 0)
               printf("Hello ");
         else
               printf("World");
}

【讨论】:

  • 首先非常感谢。如果你尽力而为但仍然无法破解它,那么它并不完全是作弊..感谢您的帮助。感谢它
  • 这是作弊 - 它没有运行应运行的 printf("Hello "),替代品 printf 甚至忘记包含空格,这意味着用户可见的错误。
  • @Steve314:感谢您指出这一点,没有注意到空格,我更正了。我同意,这是作弊,但问题本身很愚蠢(没有冒犯的意思,Ritik):如果你想执行两个语句,你不使用if/else 构造。最后它完成了工作,这才是最重要的:D
【解决方案3】:
 if(fork() == 0)
    ...

【讨论】:

  • 这里有一个竞争条件,你不知道哪个 printf 会先执行,但规则只是说“两个 printf 语句都被执行”,对顺序没有任何限制,所以对我来说看起来不错。
  • +1,太好了!值得注意的是,这只适用于 Unix,但我敢打赌,这就是提出这个问题的人所要寻找的......
  • 您可以通过设置条件!fork() || !wait(NULL)来解决排序问题
【解决方案4】:

不完全是您所要求的,但以下内容至少会打印出与执行两个 printf 时相同的结果:

     if(printf("Hello ") & 0)
           printf("Hello ");
     else
           printf("World");

【讨论】:

    【解决方案5】:
    #include <stdio.h>
    main()
    {
      if (printf("Hello "),0)
        printf("Hello ");
      else
        printf("World");
      return 0;
    }
    

    【讨论】:

      【解决方案6】:

      虽然我真的很喜欢rubber boots 答案背后的想法,但我认为可能会有一个更琐碎的答案。该描述明确指出您可能没有代码inside main(),但是如果有一个额外的行outside呢?

      #define else
      
      void main()
      {
           if(1)
                 printf("Hello ");
           else
                 printf("World");
      }
      

      更新这是由Zan Lynx 在 cmets 中提出的替代方案。它只在 CONDITION 周围的括号之间添加代码:

      void main()
      {
           if(1
      #define else
             )
                 printf("Hello ");
           else
                 printf("World");
      }
      

      【讨论】:

      • +1 表示邪恶。我喜欢它。
      • +1 好主意。我怀疑这不是预期的答案,但这更像是一个“类似 C”的答案,而不是 fork-thing(这太冗长);-)
      • 您甚至可以这样做,同时尊重您只修改 CONDITION。设置 CONDITION 等于 newline, #define else, newline, 1
      【解决方案7】:

      这是另一种方法。它不如fork 好,因为它往往只工作一半(因此不能完全解决问题),但更好的是消息永远不会被逆转。

      #include <stdio.h>
      
      int main() {
              if ( ftell( stdout ) % 2 || ( printf( " " ), main() ) )
                      printf( "Hello " );
              else
                      printf( "World\n" );
      }
      

      它首先查询stdout,看看打印了多少,字符数是否为奇数。如果是这样,它会打印一个字符来反转奇偶校验并递归。递归调用看到偶数个字符并打印“hello”并返回 0。0 将顶部调用发送到 else,打印“world”。

      终端中的字符数必须为奇数才能正常工作。

      【讨论】:

      • 我喜欢再次调用 main() 的想法。我认为您甚至可以使用if( *"x"++ == 'x' ? main(), 0 : 1 ) 确定性地打印“Hello World”。这可能需要在最近的编译器上进行一些编译器开关,以允许修改字符串文字。
      • @x:谢谢,我绞尽脑汁。我相信 C 标准库中有合法的全局变量可以使用,但我想不出任何……太生疏了。如果他只是声明 argc 和 argv,那就容易多了。
      【解决方案8】:

      直接跳下Potatoswatter指出的悬崖,我提供如下:

      #include <stdio.h>
      #include <errno.h>
      
      int main()
      {
          if ((errno == 42) || (errno=42, main()))
          printf("hello, ");
          else
          printf("world.");
         return 0; 
      }
      
      C:\...>gcc -Wall q3472196.c C:\...>一个 你好世界。 C:\...>

      我确实必须声明 main 并给它一个返回值来关闭几个警告。甚至可能在 stdio.h 本身中定义了一些适当的邪恶,因此我们不必声明 errno

      【讨论】:

      • if( stdin == 0 || ( stdin = 0, main(), 0 ) ) 怎么样?这摆脱了 errno.h 包含,并且不需要 main() 中的 return 语句。然而 stdio.h 仍然需要包含,尽管 printf() 也可以在没有它的情况下编译。
      • @x4y,鬼鬼祟祟。我喜欢它。
      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 2015-03-13
      相关资源
      最近更新 更多