のループコードのためにこれを理解することを助ける必要があるCに次のコードを考えてみましょう:私はTURB C++バージョン3.0とgcc-4.3.4を使用して、それをコンパイルするとはC
void main()
{
int a=0;
for(printf("\nA"); a; printf("\nB"));
printf("\nC");
printf("\nD");
}
、私は、出力として次を得ます両方の場合:ただし
A
C
D
私は、次のコードをコンパイルした場合、:
void main()
{
for(printf("\nA"); 0; printf("\nB"));
printf("\nC");
printf("\nD");
}
はGCC-4.3.4による出力は、前と同じですすべての
A
B
C
D
まず、私はここで何が起こっているか見当がつかない:viousケースが、ターボC++ 3.0には、次の出力を生成します!さらに、gccコンパイラの出力はどちらのコードでも同じですが、turboC++ 3.0コンパイラの場合、出力は異なりますか?誰かが光を放つことができますか?
EDIT:
は実際に誰かがIT企業のためのインタビューで、この質問をしたと彼は答えを与えるために失敗したときに、インタビュアーがこの説明を与えました。しかし、私はこれが馬鹿だと思っています。どのように "バグ"をその言語によって提供される "施設"のように使うように誰かに頼むことができますか? 「ファシリティ」と「テクニック」と呼ばれるためには、2番目の式のリテラルとして0を渡すか、値が0の変数を渡すかにかかわらず、結果は同じであったはずです。
私は面接官がそのような質問をすることは非常に愚かであり、彼の無能を示していると間違っていると思いますか?
これはコンパイラの興味深い違いですが、なぜ世界で最初にそのような 'for'ループを使用するのですか? – JAB
Cの "for"ループの構文を完全に誤解していますか?プログラミング言語で物事を書く方法を推測するだけでは、書籍やウェブコースなどが必要です。 –
@ ThomasPadron-McCarthy実際、構文はうまくいきます。それはまったく有効ではないようですが、「My cold is a toe」という文章が構文的に完全に有効ですが、ナンセンスなフレーズであるように、完全に有効です。最初の部分 'printf(" \ nA ")'は、ループの開始時に実行されます。ループがfalse/0に評価されたときに実行を停止させるセンチネル表現は、最初のもの(== 0)の場合は「a」で、2番目の場合はリテラルの「0」です。 [cont。] – JAB