1

このコードは、比較ステートメントで「これらの 2 つのオペランドに一致する演算子はありません」というエラーを返します。私は、「ノードを整数に変換/キャストできない」ことを意味するはずだと解釈します。ただし、print ステートメントは、formatで使用すると整数値を出力します。なぜそれが起こっているのですか?キャストじゃないの?ifw[2]%dprintf

NODE *w=(NODE *)malloc(4*sizeof(NODE)); 
if(w[2]==0)
  printf("%d\n",w[2]);

ノードの構造は -

struct node{
  int key;
  struct node *father;
  struct node *child[S];
  int *ss;
  int current;
};

cdhowie のコメントを参照してください。彼はその質問に答えました。

4

1 に答える 1

3

あなたが見ている動作printf()は未定義です。 printf()引数の型チェックを行いません。指定した引数が、文字列引数で指定した書式指定子と一致すると想定します。

つまり、未定義の動作を呼び出しています。型コードは引数として an を%d想定していますが、代わりにオブジェクトを指定しています。たとえば、プログラムがクラッシュする可能性があります (可能性は低いですが)。少なくとも、この特定の出力がプラットフォームやコンパイラ間で一貫しているとは限りません。intNODE

コンパイラの警告を最大にすると、これについて警告されるはずです。最新のコンパイラは引数の型チェックをprintf()行います (変数や式ではなく、文字列リテラルを最初の引数として指定すると仮定します) が、これは純粋にコンパイル時のチェックであり、エラーではなく警告のみを生成します。

于 2012-11-13T05:04:44.687 に答える