1

该代码在比较语句中给出了一个错误,指出“没有运算符与这两个操作数匹配”。if我解释,它应该意味着“一个节点不能被转换/转换成一个整数”。w[2]但是,当与%d格式一起使用时,打印语句会打印一个整数值。为什么会这样?不printf投吗?

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()不对参数进行类型检查;它假定您给出的参数与您在字符串参数中给出的格式说明符相匹配。

换句话说,您正在调用未定义的行为。类型代码%d需要一个int作为参数,但您指定的是一个NODE对象。这里可能发生任何事情——例如,您的程序可能会崩溃(尽管这不太可能)。至少,您不能依赖此特定输出在平台或编译器之间保持一致。

如果你把你的编译器警告调到最大,它应该会警告你。现代编译器将为printf()您检查参数(假设您提供字符串文字作为第一个参数,而不是变量或表达式),但这纯粹是编译时检查,它只会生成警告,而不是错误。

于 2012-11-13T05:04:44.687 回答