2016-05-04 22 views
0

この質問に対する回答を理解するのは苦労しています。コンパイル時に完全型付きチェック

次のコードを与える:以下の各代入文について

int: size, size2, j; 
float: x; 
array[1:30] of int: nums; 

を、円はか、または完全にコンパイル時に入力し、確認することができないことができるかどうか避けることができます。配列の添え字範囲がその型の一部とみなされると仮定してください。数値のオーバーフローが型エラーとみなされないとします。

A. size = size2 + 1; --> Answer: CAN 
B. x = size; --> Answer: CAN 
C. nums[j] = 33; --> Answer: CANNOT 
D. nums[3] = nums[4]; --> Answer: CAN 
E. nums[j] = nums[j+1]--> Answer: CANNOT 

コンパイル時エラーは、プログラムが実行中に実行時エラーが発生するマシンコードに変換されるときに発生します。私はまた、コンパイル対実行時エラーに関する次のスタックオーバーフローに関する質問を読んだ:Runtime vs Compile time。両方の話題を研究した後、私はまだ、次の回答がどのように得られたのか混乱しています。どんな助けでも大歓迎です。

答えて

0

コンパイル時にタイプチェッカーが論理エラーを「察知」できないかどうか質問されます。

型チェッカーは、A、Dが有効でBが無効であることを知っているので、型チェッカーCANはこれらの3つのステートメントの有効性を判断します。

しかし、CとEの場合、妥当性はjの実際の値に依存します(たとえば、j == 1の場合は有効で、j == 100の場合は無効です)。したがって、型チェッカーはCとEが有効かどうかを判断できません( "配列の添字範囲はその型の一部とみなされる"ため)。これらの回答は、型チェッカーを判断することができないという仮定に基づいていること


注/ jの値の範囲を気にしません。 AdaおよびPascalなどの一部の言語では、「範囲」タイプがサポートされているため、原則としてCタイプ(int range 1:30タイプのjが必要)とE(タイプint range 1:29jが必要)が有効です。

関連する問題