-1

私は出身phpで、次のようなものを定義するとき:

$a = array();
echo $a[586];

未定義のインデックスについての通知が届きます。

一方、c++私はこれを行うことができます:

map<int, string> my_map;
cout << "Map is: " << my_map[34535];

string sentence = "acdefb s";
cout << "Letter is: " << sentence[15];

そして、私はエラーを取得しません。

なぜそれは不可能でphpあり、可能であるのc++ですか?

4

3 に答える 3

7

PHPとC++は、セマンティクスが根本的に異なる2つの根本的に異なる言語であるためです。[]C ++のオブジェクトで演算子を使用するstd::map場合、キーがマップ内にまだ存在しない場合は、新しい要素がマップに挿入されます。PHPでは、これは当てはまりません。

を使用した2番目の例については、C ++で無効なインデックス(であるインデックス)を使用して演算子を使用することstd::string sentance無効です。で無効なインデックスを使用した結果は未定義の動作であるため、「エラー」が発生しない可能性があります。つまり、何かが発生する可能性があります。最新のプラットフォームでよく見られる結果の1つは、セグメンテーション違反/アクセス違反です。これにより、通常、プログラムがクラッシュします。[]>= sentance.length()std::stringstd::string

未定義の動作に対する保護が必要な場合は、演算子の代わりにを使用std::stringできます。無効なインデックスを使用すると、関数は境界チェックを実行してスローします。std::string::at()[]atstd::out_of_range

于 2013-02-08T20:47:59.510 に答える
3

C ++は、パフォーマンスのために作成された言語です。1,000万個のアイテムを含む配列があり、すべてのアイテムを合法的にウォークスルーする場合、それらの1,000万個のアクセスのすべてが有効かどうかを確認する時間が追加されます。副作用として、「正しい」状況下では、検出されずに有効な範囲外に出ることもできます。有効な範囲から大きく外れると、何かがうまくいかない可能性があります。しかし、C ++は、それがうまくいかないこと、または他に何が起こるかを保証しません-それは「未定義動作」と呼ばれるものです-略してUB。

マップの場合、それはとにかくあなたが思っていることをしません、それは実際にあなたのコンテナに新しい空の要素を作成し、そしてそれを印刷します。

したがって、「不明な」インデックスがある場合(たとえば、インデックスをパラメーターとして受け取る関数など)、少なくともコードのデバッグビルドでは、値が範囲内にあることを確認することをお勧めします。たとえば、次のassert()ように使用できます。

// v is a vector, or string, or some such. 
assert(index < v.size); 

これにより、有効な範囲外になるとプログラムが「中断」されます。リリースビルドでは、assert何もコンパイルされないため、適切なリリースビルドでコードを実行するときに余分なコードはありません。

于 2013-02-08T21:16:55.987 に答える
0

文字列の長さよりも大きい値で文の文字列にインデックスを付けると、ほとんどの場合、セグメンテーション違反が発生します。このコードが実際にエラーなしで実行されている場合、それは「幸いなことに」このメモリアドレスがプロセスによって所有されていないものに解決されないためです。代わりに、あなたはただゴミを得るでしょう。

于 2013-02-08T20:53:32.347 に答える