C语言 运算符优先级与结合性

如果一个表达式中的两个操作数具有相同的优先级,那么它们的结合律(associativity)决定它们的组合方式是从左到右或是从右到左


C语言运算符优先级及结合性如下图所示

image-20230104135551877


犯过的错误

*p++ 等价于 *(p++)

具体错误代码如下

void preOrder(struct TreeNode *root, int *ans, int *returnSize){
    if(root == NULL){
        return ;
    }
    ans[*returnSize] = root->val;
    *returnSize++;		//error
    preOrder(root->left, ans, returnSize);
    preOrder(root->right, ans, returnSize);
}

此为二叉树先序遍,当将root->val放到遍历数组中之后,需要将returnSize的值增1,于是就有了错误的操作

*returnSize++;

此操作等价于*(returnSize++),把指向数组大小的指针后移了1位,使returnSize指向了未知的内存空间

正解:

(*returnSize)++;

才是将returnSize指向的数组大小变量增1

注意

*returnSize++ 等价于 *(returnSize++)

这里并不是自增运算符(++)的优先级要高于间接引用运算符( * ) 一元运算符的优先级是相同的,即++和*的优先级是相同的。

正确的理解是,一元运算符的结合性是从右到左,因此returnSize先于++结合,即(returnSize++),再结合间接引用运算符*,等价于 *(returnSize++),试图访问returnSize所指空间之后的未知空间。

posted @ 2023-01-04 14:12  dctwan  阅读(165)  评论(0编辑  收藏  举报