0

我正在阅读 C++ 源代码,将中缀转换为后缀我正在使用 turbo C++

 #include <stdio.h>
 typedef struct node
{
  float data;
  struct node *next;
} stack;

void StackInitiate(stack **head)
{
  //error
  if(*head=(stack *)malloc(sizeof(stack))==NULL)
      exit(1);
  (*head)->next=NULL;
}

// 我得到 .. 无法将 'int' 转换为 'node *' ...

谁能告诉我为什么会这样。以及如何解决它。

完整的源代码在这里

4

2 回答 2

3

由于运算符优先级,表达式

*head=(stack *)malloc(sizeof(stack))==NULL

实际上相当于

*head=((stack *)malloc(sizeof(stack))==NULL)

也就是说,您将比较的值分配给*head

您需要放入自己的括号以使其正确:

(*head=(stack *)malloc(sizeof(stack)))==NULL

或者更好的是使用new运算符,这是您真正应该使用的在 C++ 中动态分配对象的运算符:

(*head=new stack)==NULL
于 2017-01-07T19:07:25.810 回答
2

由于运算符优先级规则,以下内容:

if(*head=(stack *)malloc(sizeof(stack))==NULL)

被解析为

if(*head=((stack *)malloc(sizeof(stack))==NULL))

== NULL比较结果分配给*head.

要将 的新值*head与 null 进行比较,请使用括号更改优先级:

if((*head=(stack *)malloc(sizeof(stack)))==NULL)

或者更好的是,将赋值与 if 条件分开:

*head = (stack *) malloc(sizeof(stack));
if(*head == NULL)

这种约定更具可读性,并且还可以避免将来发生类似的错误。

于 2017-01-07T19:07:20.880 回答