什么代码可以使这个循环工作



这是在面试中问我的问题-

for( blah blah ) { 
   cout<<"World";
}

我的任务是更换blah blah,使打印输出为:- Hello World !

我只被允许更改那些废话,仅此而已。没有低于或高于此级别的代码更改!

如果可以为blah blah:放入任何内容,为什么还要担心for循环的主体

for(int i = 0 ; std::cout << "Hello world!", i < 0;   ) { 
   std::cout<<"World";
}

他们没有说你需要实际运行循环,是吗?

#include <iostream>
#include <ios>
using namespace std;
int main() {
    for (int i = (cout << "Hello World!",0); i; ) { cout << "World"; }
}

我花了一点时间试图将循环控制为一次迭代:

#include <iostream>
#include <ios>
using namespace std;
int main() {
    for (cout << "Hello "; cout; cout.setstate(ios::badbit)) { cout << "World"; }
}

如果!要在输出中,则此代码将执行以下操作:

#include <iostream>
#include <ios>
using namespace std;
int main() {
    for (cout << "Hello "; cout; cout << "!", cout.setstate(ios::badbit)) {
        cout << "World";
    }
}

有两个问题需要解决。

  1. 循环标题中的输出
  2. 抑制迭代

在for声明的第一部分中,您几乎可以执行每一个命令。因此,在这里打印所需的输出是个好主意。

要抑制迭代,只需输入false作为条件。页眉的最后部分可以留空。

#include <iostream>
using namespace std;
int main()
{
    for ( cout<<"Hello World!"<<endl ; false ; )
    {
            cout<<"World"<<endl;
    }
    return 0;
}

blah blah:如何

const char *p = "Hello "; *p; cout << *p, p++); if (1 

显然,for循环不过是一种转移。这样看:

for(
/* Your Code Here */
) { cout << "World"; }

所以,你需要做的第一件事就是清除程序中已经存在的所有讨厌的代码:

for(
/* Your Code Begins */
;0;);
/* TODO */
if(0
/* Your Code Ends */
) { cout << "World"; }

既然,他们自然会想测试你的聪明,那么让我们接下来做一些非常聪明的事情:

    for(
    /* Your Code Begins */
    ;0;);
    struct cout {
        void operator<<(cout world)
        {
            hello <world> !"";
        }
        char const* out;
        cout() : out(0) { }
        cout(char const* out) : out(out) { }
        operator bool() { return !out; }
        struct typeof
        {
            typeof(decltype(::std::cout) const&) { }
            void operator>(bool a)
            {
                ::std::cout << (!a ? "!" : "?");
            }
        };
        struct
        {
            typeof operator<(cout c)
            {
                return typeof(::std::cout << "Hello " << c.out);
            }
        } hello;
    } cout;
    if(cout
    /* Your Code Ends */
    ) { cout << "World"; }

注意:由于他们喜欢cout这个名称,所以一定要在代码中大量使用它!

此外,要注意一个常见的GCC错误(他们称之为"扩展"),这可能会导致完全符合标准的c++代码出现问题。

最后,请记住,最初的指令在结尾处没有调用任何换行符,因此不要期望任何换行符。如果希望立即看到输出,则可能需要刷新输出。

您必须跳过的一些障碍似乎没有必要,但使用嵌套类而不是命名空间级别的嵌套类的严格要求会导致适当的运算符重载出现一些问题。

就我个人而言,我想指出的是,这段代码非常容易理解:它所做的只是说hello <world>!,所以让我们快速地重新格式化结果,得到最终的代码(这次,省略了周围的结构):

    ;0;);struct cout{void operator<<(cout world){
        hello <world>!
    "";}char const*out;cout():out(0){}cout(char const*out):out(out){}
    operator bool(){return!out;}struct
    typeof{typeof(decltype(::std::cout)const&){}void
    operator>(bool a){::std::cout<<(!a?"!":"?");}};
    struct{typeof operator<(cout c){return
    typeof(::std::cout<<"Hello "<<c.out);}}hello;}cout;if(cout

当然,最后一步只是出于纯粹的美学原因,如果需要,可以省略。

附言:它实际上打印的是"你好世界",而不是":-你好世界!",我想这正是问题所说的。将其更改为符合其他格式,留给读者练习。

使用C++不识别空格的事实!

for(int i = 0; i < 0; ++i); if(true){ cout << "Hello World!"; } else { //blah blah ) { 
    cout<<"World";
}

没有人愿意修复明显损坏的代码,这些代码访问了一些神秘的、从未定义的cout,这是非常明显可怕的代码,所以。。。解决方法是:

#include <iostream>
#define BLAH 
  struct { 
    template <typename T> 
    void operator<<(T const& t) const { 
      ::std::cout << ":- Hello " << t << " !n"; 
    } 
    bool okay;
  } cout{true}; 
  cout.okay; 
  cout.okay = false
int main() {
  for(BLAH) {
    cout<<"World";
  }
}

只有为了更好的可读性,我认为你可以换成一个单独的#define,称为BLAH

注意:我的gcc拒绝构建这个,但clang以最高的警告级别接受了这个。我正在像这样构建hw.cpp

make CXXFLAGS=-Wall -Wextra -pedantic -std=c++11 CXX=clang++ hw

最新更新