BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #86169同步于 2015/3/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

c++新特性中bool函数有默认返回值吗?

yunwu
2015/3/27镜像同步8 回复
LeetCode第110道题,判断是否为平衡二叉树,原题如下: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 在网上搜到了一种解法让我非常困惑,如下: class Solution { public: bool isBalanced(TreeNode *root) { // Note: The Solution object is instantiated only once and is reused by each test case. int depth = 0; return isbalance(root, depth); } bool isbalance(TreeNode *root, int &depth) { if(root == NULL) { depth = 0; return true; } int ld,rd; if( isbalance(root->left,ld) && isbalance(root->right,rd)) { if( abs(ld - rd) > 1) { return false; } depth = ld > rd ? ld + 1 : rd + 1; return true; } } }; 判断函数中的return语句写在了if语句之中,那么如果一个子树不满足平衡二叉树的条件的话,它向上层递归返回false,这样一来上层递归的if语句就不会被执行,它也不会再向更上一层的递归返回true或false值。 不过这种解法是能AC的,难道LeetCode的编译器将bool函数返回值默认定义了false吗?求助。。。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
nuanyangyang机器人#1 · 2015/3/27
C语言没有所谓的“默认返回值”。凡是返回值类型不是void的函数,只要有可能的控制流执行到函数结尾却不遇到return语句,就是undefined behaviour。C语言标准对此不做任何规定,也就是语言实现(编译器、运行库、处理器等)做什么都行,从什么都不发生到机器冒烟都是C语言标准允许的结果。所以,结论:你贴的代码是错误的,因为最后一个if(你的红字)的条件如果是假,就会到达函数末尾而不执行任何return语句。 如果这个程序可以AC,那么只是巧合。那是OJ的问题。
yunwu机器人#2 · 2015/3/27
多谢暖神解惑[ema23] 【 在 nuanyangyang 的大作中提到: 】 : C语言没有所谓的“默认返回值”。凡是返回值类型不是void的函数,只要有可能的控制流执行到函数结尾却不遇到return语句,就是undefined behaviour。C语言标准对此不做任何规定,也就是语言实现(编译器、运行库、处理器等)做什么都行,从什么都不发生到机器冒烟都是C语言标准允许的结果。所以,结论:你贴的代码是错误的,因为最后一个if(你的红字)的条件如果是假,就会到达函数末尾而不执行任何return语句。 : 如果这个程序可以AC,那么只是巧合。那是OJ的问题。
glswy机器人#3 · 2015/3/27
又见机器冒烟。 【 在 nuanyangyang 的大作中提到: 】 : C语言没有所谓的“默认返回值”。凡是返回值类型不是void的函数,只要有可能的控制流执行到函数结尾却不遇到return语句,就是undefined behaviour。C语言标准对此不做任何规定,也就是语言实现(编译器、运行库、处理器等)做什么都行,从什么都不发生到机器冒烟都是C语言标准允许的结果。所以,结论:你贴的代码是错误的,因为最后一个if(你的红字)的条件如果是假,就会到达函数末尾而不执行任何return语句。 : 如果这个程序可以AC,那么只是巧合。那是OJ的问题。
moonfighting机器人#4 · 2015/3/27
LeetCode的函数返回机制确实让人疑惑,我有几个题忘了返回最后的结果了还是AC了
nuanyangyang机器人#5 · 2015/3/27
【 在 moonfighting 的大作中提到: 】 : LeetCode的函数返回机制确实让人疑惑,我有几个题忘了返回最后的结果了还是AC了 哪里有什么“LeetCode的函数返回机制”,只能说:“LeetCode选用的编译器碰巧能把某些有undefined behaviour的程序编译成能AC的程序。”要练习编程就应该学C/C++,不要去猜测某个网站的编译器的行为。
moonfighting机器人#6 · 2015/3/27
啊,我就是那个意思啦,只是省略着说了。刷leetcode是为了找工作面试,当然不会去在意这些东西了。 【 在 nuanyangyang 的大作中提到: 】 : : 哪里有什么“LeetCode的函数返回机制”,只能说:“LeetCode选用的编译器碰巧能把某些有undefined behaviour的程序编译成能AC的程序。”要练习编程就应该学C/C++,不要去猜测某个网站的编译器的行为。
nuanyangyang机器人#7 · 2015/3/27
【 在 moonfighting 的大作中提到: 】 : 啊,我就是那个意思啦,只是省略着说了。刷leetcode是为了找工作面试,当然不会去在意这些东西了。 为了以后工作中可以不写让机器冒烟的代码(没准哪天我会成为你的客户呢[ema21]),还是留意一下这些细节吧。
moonfighting机器人#8 · 2015/3/27
谨遵暖神教诲 【 在 nuanyangyang 的大作中提到: 】 : : 为了以后工作中可以不写让机器冒烟的代码(没准哪天我会成为你的客户呢),还是留意一下这些细节吧。