0

次のコードスニペットがあるとします。

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 15

typedef struct{
  int touchdowns;
  int interceptions;
  int tackles[MAX_SIZE + 1];        //this is the line in question
}stats;

私に投げかけられた質問は、「なぜこの行(上記で示されている)がタックルの可能な数に1を加えるのですか?」でした。

----なぜ人も欲しがるのではなく、どのように/なぜそれが機能するのか。言い換えれば、それが必ずしも有効なロジックではなく、有効なコードであるのはなぜですか。-明確化

この質問に詳細に答える方法がわかりません。どんな助けでもいただければ幸いです。

4

3 に答える 3

2

Arminが指摘したように、トークンMAX_SIZEはプリプロセッサに置き換えられます。しかし、明確にするために、それが最終的に機能/コンパイルされる理由ではありません。これをコンパイルするための実際の要件は、配列サイズが定数の整数式であるということです。これは、問題のコードに適用されます。

于 2013-02-23T20:14:28.150 に答える
1

コードがコンパイルされ、行が次のようになると、MAX_SIZEは100に置き換えられます。

int tackles[100 + 1];

これはと同じです

int tackles[101];  



ドキュメント から:

プリプロセッサマクロを定義するには、#defineを使用できます。その形式は次のとおりです。

#define identifier replacement

プリプロセッサがこのディレクティブに遭遇すると、コードの残りの部分で出現する識別子を置換によって置換します。この置換は、式、ステートメント、ブロック、または単に何でもかまいません。プリプロセッサはC++を理解せず、識別子の出現箇所を置換によって置き換えるだけです。

#define TABLE_SIZE 100
int table1[TABLE_SIZE];
int table2[TABLE_SIZE]; 

プリプロセッサがTABLE_SIZEを置き換えた後、コードは次のようになります。

int table1[100];
int table2[100]; 
于 2013-02-23T20:00:01.810 に答える
0

おそらく、tacklesはターミネータ値(-1など)で終了する配列であるため、C文字列がヌル文字で終了する方法と同様です。構造にタックルの数を示すメンバーがないことに注意してください。

于 2013-02-23T20:03:12.753 に答える