遇到第一个返回语句时函数执行不退出

Posted

技术标签:

【中文标题】遇到第一个返回语句时函数执行不退出【英文标题】:Function execution not exiting on encountering first return statement 【发布时间】:2012-09-24 22:28:26 【问题描述】:
Buffer* b_create(int init_capacity, char inc_factor,char o_mode)

Buffer* buffer=NULL;    /*local pointer to the buffer structure on heap*/ 

if (o_mode=='f' || inc_factor==0)
    o_mode=0;
    inc_factor=0;
else if (o_mode=='f' && inc_factor!=0)
    o_mode=0;
    inc_factor=0;
else if (o_mode=='a' && 1<=inc_factor<=255)
    o_mode=1;
    inc_factor=inc_factor;
else if (o_mode=='m' && 1<=inc_factor<=100)
    o_mode=-1;
    inc_factor=inc_factor;

else
    buffer=NULL;
    return buffer;


    //throw a more meaningful error??

    //cleanup :: how about i just call the ca_destroy() ??
    /*
    free(buffer->ca_head);
    buffer->ca_head=NULL;
    free(buffer);
    buffer=NULL;
*/

buffer = (Buffer*)malloc(sizeof(Buffer));
buffer->ca_head=(char*)malloc(sizeof(char)*init_capacity);
buffer->mode=o_mode;
buffer->inc_factor=inc_factor;

buffer->capacity=init_capacity;
buffer->addc_offset=0;
buffer->mark_offset=0;
buffer->r_flag=0;

return buffer;


我有上述方法。我正在努力让它工作。首先,我检查并设置了几个变量。如果没有任何情况适用,那么我将缓冲区设置为 NULL 并尝试将值返回给调用函数。

else
    buffer=NULL;
    return buffer;

但是,在返回之后,函数会继续并继续创建缓冲区结构。我希望该函数一旦看到返回语句就会退出。为什么会继续执行??

【问题讨论】:

我经常有点太确定程序流程是否按照我认为的方式流动......验证是否达到了回报。要么在调试器中运行,要么在 buffer=NULL 之间放入 printf;和返回缓冲区;声明。 1&lt;=inc_factor&lt;=100) 那样不行。 感谢加托!你说得很对。编程时不应该假设! 【参考方案1】:

这个条件

1<=inc_factor<=255

总是正确的。它被解析为(1 &lt;= inc_factor) &lt;= 255,而1 &lt;= inc_factor 的计算结果为0 或1。因此,如果o_mode'a''m' 之一,则即使inc_factor 为0 或否定的。

查看条件链,我们发现:

if (o_mode=='f' || inc_factor==0)
    o_mode=0;
    inc_factor=0;
else if (o_mode=='f' && inc_factor!=0) // This is never true, because if o_mode == 'f',
    o_mode=0;                            // the first one already was true
    inc_factor=0;
else if (o_mode=='a' && 1<=inc_factor<=255) // This is just o_mode == 'a'
    o_mode=1;
    inc_factor=inc_factor;
else if (o_mode=='m' && 1<=inc_factor<=100) // This is just o_mode == 'm'
    o_mode=-1;
    inc_factor=inc_factor;

else // This is only reached if o_mode is none of 'f', 'a', 'm' and inc_factor is != 0
    buffer=NULL;
    return buffer;

但如果o_mode 不是'f', 'a', 'm'inc_factor != 0,则到达最终的else 并返回NULL。没有任何实现被破坏到足以忽略return 语句。

【讨论】:

以上是关于遇到第一个返回语句时函数执行不退出的主要内容,如果未能解决你的问题,请参考以下文章

c语言 退出整个程序或函数的命令是啥

c语言一个死循环中为啥执行完一个功能函数就退出了?

Python生成器

86.返回类型和return语句

javascript 函数详解

javascript 函数详解