C++ 以下代码?;

C++ 以下代码?;,c++,C++,关于这个问题,我有两个代码。 这是一个错误的代码 class Solution { public: TreeNode* pruneTree(TreeNode* root) { if(root == NULL) return NULL; if((root->left = pruneTree(root->left)) == NULL && (root->right = pruneT

关于这个问题,我有两个代码。
这是一个错误的代码

class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        if(root == NULL)
            return NULL;
        if((root->left = pruneTree(root->left)) == NULL &&
           (root->right = pruneTree(root->right)) == NULL){
            if(root->val == 0){
                delete root;
                return NULL;
            }       
        }
        return root;
    }
};
这是我传递的代码

class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        if(root == NULL)
            return NULL;
        root->left = pruneTree(root->left);
        root->right = pruneTree(root->right);
        if(root->left == NULL && root->right == NULL){
            if(root->val == 0){
                delete root;
                return NULL;
            }       
        }
        return root;
    }
};

我想知道是什么原因导致这两个程序之间的差异

在第二个代码中,保证调用
pruneTree(root->left)
pruneTree(root->right)
,因为这是两个独立的表达式

root->left = pruneTree(root->left);
root->right = pruneTree(root->right);
在第一个代码中,您有:

(root->left = pruneTree(root->left)) == NULL &&
           (root->right = pruneTree(root->right)) == NULL
这里的区别在于
pruneTree(root->left)
pruneTree(root->right)
在一个表达式中,因此它们可能(在本例中是do)相互依赖


如果
(root->left=pruneTree(root->left))==NULL
的计算结果为
false
,则不需要计算
&
后面的部分,因为完整表达式不能再变为true。

如果left为NULL,则第一个表达式不会向右修剪。请阅读关于短路的内容。