📜  C 运算符关联性 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:13:48.458000             🧑  作者: Mango

C 运算符关联性

C 语言中的运算符是用于执行各种操作的特殊符号,例如,算术运算、关系运算、逻辑运算等。而运算符关联性则是指多个相同类型的操作符出现时,它们在表达式中的执行顺序,也就是优先级和结合性。

优先级

在表达式中,运算符的优先级决定了它们的执行顺序,优先级高的运算符先被计算,优先级相同的运算符则按照结合性决定先后顺序。

以下是 C 语言中常用运算符的优先级(从高到低):

| 运算符 | 描述 | | ---------- | ------------------------------------------------------------ | | () | 用于改变运算次序 | | [] | 数组下标 | | -> | 结构体/联合体成员访问 | | ++, -- | 前缀自增/自减、后缀自增/自减 | | +, - | 正数和负数、加法和减法 | | !, ~ | 逻辑非和按位取反 | | * | 指针变量引用 | | & | 取地址符,取变量的地址 | | sizeof() | 取变量/类型大小 | | *,/,% | 乘法,除法,求余 | | +, - | 加法和减法,二元操作符的减法称为取负运算 | | <<, >> | 左移、右移 | | <, <=, >, >= | 关系运算符,比较两个操作数的大小。 | | ==, != | 等于操作符、不等于操作符 | | & | 按位与,对两个操作数的位执行逻辑 AND 运算。 | | ^ | 按位异或,对两个操作数的位执行异或操作 | | | | 按位或,对两个操作数的位执行逻辑 OR 运算。 | | && | 逻辑与,当且仅当两个操作数都非零时结果为真。 | | || | 逻辑或,有一个操作数非零时结果为真。 | | ? : | 三元条件运算符,也称为条件运算符 | | = | 赋值运算符 | | +=, -= | 加等于、减等于 | | *=, /= | 乘等于、除等于 | | %=, <<= | 求余等于、左移等于 | | >>=, &= | 右移等于、按位与等于 | | ^=, |= | 异或等于、按位或等于 |

#include <stdio.h>

int main() {
    int a = 2, b = 3, c = 4;
    int d = a * b + c; // (a * b) + c
    int e = a + b * c; // a + (b * c)
    int f = a == b + c; // (a == (b + c))

    printf("d = %d\n", d);
    printf("e = %d\n", e);
    printf("f = %d\n", f);

    return 0;
}

在上述代码中,由于乘法运算符的优先级高于加法运算符,所以 d = a * b + c 等价于 (a * b) + c,结果为 10e = a + b * c 等价于 a + (b * c),结果为 14;而等于运算符优先级低于加法运算符,所以 f = a == b + c 等价于 a == (b + c),结果为 0(即假)。

结合性

当表达式中出现多个相同优先级的运算符时,它们的执行顺序将由结合性决定,即从左到右(左结合性)或从右到左(右结合性)。

常见的左结合运算符有:赋值运算符 =、逻辑与运算符 &&、逻辑或运算符 ||、逗号运算符 , 等,例如:a = b = c = d 等价于 a = (b = (c = d))

常见的右结合运算符有:幂运算符 ^、条件运算符 ?:、函数调用运算符 ()、指针成员访问运算符 -> 等,例如:a = b ? c : d 等价于 a = (b ? c : d)

注意事项

为了避免由于运算符关联性导致的意外错误,建议在表达式中使用圆括号来明确运算次序,同时也有助于增加程序的可读性。

#include <stdio.h>

int main() {
    int a = 2, b = 3, c = 4;
    int d = (a * b) + c;
    int e = a + (b * c);
    int f = a == (b + c);

    printf("d = %d\n", d);
    printf("e = %d\n", e);
    printf("f = %d\n", f);

    return 0;
}

在本示例中,将乘法运算和加法运算都添加了圆括号,可以更确切地表示它们的运算顺序,避免了由于运算符关联性导致的错误。