所以这是面试时问我的问题-
for( blah blah ) {
cout<<"World";
}
我的任务是替换blah blah
,以便打印输出:- Hello World !
而且我只能更改blah blah短语,仅此而已。没有低于或高于它的代码更改!
如果可以在 for 中放入任何内容,为什么还要担心 for 循环的主体blah blah
:
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";
}
}
有两个问题需要解决。
在 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
当然,最后一步只是出于纯粹的审美原因,如果需要,可以省略。
PS:它实际上打印“Hello World!”,而不是“:- Hello World!”,我认为这正是问题所说的。将其更改为符合其他格式留给读者作为练习。
没有人费心去修复明显损坏的代码,它会访问一些神秘的 never-defined 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
使用 C++ 不识别空格的事实!
for(int i = 0; i < 0; ++i); if(true){ cout << "Hello World!"; } else { //blah blah ) {
cout<<"World";
}