返回int类型的自定义函数中是否可以使用printf函数?
返回值为int的自定义函数可以使用printf的原因
- C语言中函数的返回值类型和函数内部执行的操作是两个完全独立的语法规则:返回值仅约定函数执行完毕后需要向调用方传递一个指定类型的结果,并不限制函数执行过程中可以调用的其他函数、可以执行的逻辑。
printf是C标准库提供的通用输出函数,本身没有调用场景的限制,只要引入了stdio.h头文件,在任何函数内都可以正常调用,和当前所在函数的返回值类型没有任何关联。
你当前代码存在的隐藏问题
你现在没有收到编译器报错/警告,大概率是因为使用的编译器默认告警等级较低,你的代码其实存在未定义行为隐患:
int pop(struct stack *stack) { if (stack->top == -1) { printf("stack is empty! you can't perform POP operation.\n"); // 该分支没有写return语句,函数执行到这里结束时返回值是完全随机的垃圾值 } else { int tmp = stack->data[stack->top]; stack->top--; return tmp; } }
你可以给编译器开启高告警等级验证:比如使用GCC编译时加上-Wall -Wextra参数,就会收到control reaches end of non-void function的警告。
修复建议
你可以根据业务需求选择其中一种修复方案:
- 约定错误返回值:比如栈为空时返回约定的非法值(比如
-1,注意如果你的栈元素允许存储-1,可以换成其他不可能出现的取值,或者配合全局errno标记错误):
int pop(struct stack *stack) { if (stack->top == -1) { printf("stack is empty! you can't perform POP operation.\n"); return -1; // 补充返回约定错误值 } int tmp = stack->data[stack->top]; stack->top--; return tmp; }
- 调整函数设计:改成返回错误码,弹出的元素通过出参返回,逻辑更严谨:
// 返回0表示成功,返回-1表示栈为空 int pop(struct stack *stack, int *out_val) { if (stack->top == -1) { printf("stack is empty! you can't perform POP operation.\n"); return -1; } *out_val = stack->data[stack->top]; stack->top--; return 0; }
内容的提问来源于stack exchange,提问作者Nirmal
相关产品推荐
相关产品推荐

