2017-02-07 13 views
0
const char ca[] = {'h','e','l','l','o'}; 
const char *cp = ca; 
// printf("%s\n",cp); 
while(*cp) { 
    cout << *cp << endl; 
    ++cp; 
} 

最初に印刷:C++ Whileステートメントと文字列処理の混乱?

h 
e 
l 
l 
o 
// end 

は、私は "printfの" 文のコメントを解除:?

hello%s 

h 
e 
l 
l 
o 
% 
s 


// end 

なぜ結果がとても異なっている、どのように正確な "ながら" 状態出口(い* cpの値)? C++プライマー第五ページ110

答えて

3
while(*cp) 

それはNUL文字を見つけるまでこのループ条件がループしています。それはと同等です:

while(*cp != '\0') 

caはNUL-終了していないので、ループは、配列の終わりをオフに実行され、未定義の動作を呼び出します。未定義の動作は何かが起こる可能性があることを意味&dagger;この問題を解決するには

const char ca[] = {'h','e','l','l','o','\0'}; 

または、等価的に、

const char ca[] = "hello"; 

&ダガーとNULターミネーターを加えます。最初のケースでは、'o'に続いてメモリにNULバイトが存在するため、ループがすぐ終了するように見えます。しかし、2番目のケースでは、"%s"文字列がcaに隣接しているので、それも印刷されます。 "%s"は適切なNUL終端なので、ループは印刷後に終了します。

無害printf()コールは無関係ループの動作を変更することができるという事実は、未定義の動作がいかに予測不能の一例です。それはいつもそんなに良性ではありません。プログラムがクラッシュする可能性があります。それはそれがしばらくの間働くことを続けさせることができ、そしてその後、完全に困惑する方法で間違っている。予想外に動作する未定義の動作に依存しないでください。