C语言 函数返回 1 而不是值?



我正在编写一个队列数据结构,一旦在堆栈中返回该值,我就无法在数组中保留整数的值。pop 函数正在做它需要做的事情,但为什么主要不获取该信息?我错过了什么?马洛克?

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int QUE[20];
const int EMPTY = -1;
int position = -1;
int retrieve = 0;
//push, append to front of array
bool push(int num) {
if (position >= 20) return false;
position += 1;
QUE[position] = num;
return true;
}
//pop from top of array
bool pop() {
if(QUE[retrieve] == 0) return false;
int hold = QUE[retrieve];
printf("%d",hold);
retrieve ++;
return hold;
}
// PEEK
// First in first out
int main() {
push(12);
push(90);
push(22);
int t;
//why does pop equal 1
while ((t = pop()) != 0) {
printf("t = %dn",t);
}
}

您正在尝试在同一值中传递两种不同类型的信息——布尔状态"pop 成功"和从队列中弹出的整数值。这很糟糕;不匹配导致您将返回类型声明为bool,这会导致结果值t为零或 1(分别作为falsetrue转换为int类型(。

尝试将操作拆分为测试和获取阶段,例如:

bool anyItemInQueue()
{
return _add_appropriate_condition_here_;
}
int main()
{
....
while( anyItemInQueue() )
{
int t = pop();
.... // use t here
}
}

或者传递另一个变量来接收另一个值:

bool pop(int *result)
{
if( anyItemInQueue() )
{
*result = QUE[retrieve];
....                        // some housekeeping here
return true;                // success status
}
return false;                   // failure status
}
int main()
{
....
int t;
while( pop( & t ) )      // point at t to receive the popped value
{
.... // use t here
}
}

这是因为任何非零值都转换为booltrue,然后转换为整数。booltrue的整数值为1

您的代码具有未定义的行为。

例如,让我们考虑函数push

//push, append to front of array
bool push(int num) {
if (position >= 20) return false;
position += 1;
QUE[position] = num;
return true;
}

为了简单起见,我们还假设数组QUE只有一个元素,即声明为

int QUE[1];

在这种情况下,由于数组的容量,队列只能包含一个推送值。

所以在第一次打电话给push喜欢之后

push( 0 );

您将拥有该position等于0并且队列包含值0.

如果第二次调用该函数,例如

push( 1 );

函数中的条件

if (position >= 1) return false;

不会计算为 true,因为position的当前值为0。因此,该函数将尝试将值1写入数组QUE[1]的无效位置。

数组只包含一个元素,但该函数允许再写入一个元素。

现在让我们考虑函数pop

bool pop() {
if(QUE[retrieve] == 0) return false;
int hold = QUE[retrieve];
printf("%d",hold);
retrieve ++;
return hold;
}

以及已经只包含一个等于0的元素的同一队列(请参阅上一个调用push( 0 )(。

作为 if 语句的条件

if(QUE[retrieve] == 0) return false;

计算结果为 true(队列确实包含提前推送到队列上的值 0(,则函数将返回 false,就好像队列为空一样,尽管它不为空。

所以这个函数是无效的。

此外,在主回路中

while ((t = pop()) != 0) {
printf("t = %dn",t);
}

您似乎正在尝试输出存储在队列中的值。但是,该函数不返回此类值。由于返回类型bool是 C 标准类型的 typedef,_Bool任何返回值都将转换为01

所以程序是完全错误的。

相关内容

  • 没有找到相关文章

最新更新