1

私は危険で避けるべき特定のスタイルのコードを見たことがありますが、多くの場所で何度も見たので、何かが欠けているかどうか混乱しています。

int a[100];

/* Some code later */

for(i =0; (i < 100 && a[i] != 0); i++)
           :
           :

上記のコードでは、式 (i < 100 && a[i] != 0) が右から左に評価される可能性があります。その場合、i == 100 の場合、配列 'a の範囲外になります。 '。

これが安全なコードであるかどうかを誰かが説明できますか

4

5 に答える 5

4
  1. の評価または引数の順序は明確に定義されており&&、変更することはできません。
  2. #1短絡と相まって、これは完全に安全になります。

参考文献:

C++03 標準:

セクション 5: 式、パラ 4:

特に明記されている場合を除き [例: && および || の特別なルール] ]、個々の演算子のオペランドと個々の式の部分式の評価の順序、および副作用が発生する順序は規定されていません。

C99 標準:

セクション 6.5:

演算子とオペランドのグループ化は、構文によって示されます.72) 後で指定される場合を除き(関数呼び出し ()、&&、||、?:、およびカンマ演算子について)、部分式の評価の順序およびどちらの副作用が発生するかは、どちらも特定されていません。

注:私のものを強調してください。

于 2013-06-19T04:48:38.233 に答える
3

が false の場合はアクセスしない短絡評価が当てにできると思います。a[i]i < 100

于 2013-06-19T04:46:56.363 に答える
2

(i < 100 && a[i] != 0)を右から左に評価することはできません。&&そして||、最初に左の引数を評価し、必要な場合にのみ右の引数を評価するように明示的に定義されています。

于 2013-06-19T04:47:05.450 に答える