C 语言支持 + - * / % 五种运算,加减乘除取模。
所有 CPU 都内建加法器,可以完成加法操作。减法操作可以转为加法操作。大部分 CPU 都没有内置乘法器,此时编译器会把 * / 乘除运算转为加法运算,用软件来模拟乘法。
逻辑运算的返回结果是 1 或 0,C 语言中没有布尔类型,真假即用 1 和 0 代替。
逻辑与 &&:两侧表达式都为真时,表达式为真,否则为假。 逻辑或 ||:两侧表达式都为假时,表达式才为假,否则为真。
注意:C 语言在处理逻辑与 && 和逻辑或 || 时,如果逻辑与的左表达式为假或逻辑或的左表达式为真,则不会再执行右表达式。
#include <stdio.h> int main() { int a = 6; int res; res = ((a == 6) || printf("right express run\n")); printf("end of main,res is:%d\n", res); }输出为:
end of main,res is:1跟数学中的比较运算一致。
三目运算符。a ? b : c 中,a 表达式为真时执行 b,否则执行 c。
按位左移 <<:相当于乘法,左移 n 位相当于乘以2的n次方。最低位一律补0。 按位右移 >>:相当于除法,右移 n 位相当于除以2的n次方。有符号数最高位补符号位(负数补1,正数补0),无符号数最高位补0。
例如对于 0x1(0000 0001),左移一位后,变为 0x2(0000 0010)。乘以 32 相当于左移 5 位。
#include <stdio.h> int main() { char a = 0x1; int i; for (i = 0; i < 8; i++) { a = a<<1; printf("0x%x\n", a); } a = 1; for (i = 0; i < 8; i++) { a = a>>1; printf("0x%x\n", a); } a = -1; for (i = 0; i < 8; i++) { a = a>>1; printf("0x%x\n", a); } unsigned char b = -1; for (i = 0; i < 8; i++) { b = b>>1; printf("0x%x\n", b); } }& 也叫清零器,| 也叫设置器。例如,将变量的第3位设置为1或清除为0:
#include <stdio.h> int main() { char a = 0x1; // 0000 0001 a = a | (1 << 3); // 0000 1001 printf("%x\n", a); a = a & (~(1 << 3)); // 0000 0001,为了安全,这里不要直接计算 printf("%x\n", a); }0xf0 按位取反得到 0x0f。
除了 = 赋值运算外,还可以在 C 语言中使用符合赋值运算符 +=、-=、*=、/= 、%=、&=、|=。例如上面的例子可以变成:
a |= (1 << 3); //a = a | (1 << 3); a &= (~(1 << 3)); //a = a & (~(1 << 3));小括号除了可以改变优先级外,还可以用于函数访问。
方括号可以用在数组声明定义和使用中,用于访问指定内存。
函数体、struct、union 体。
->:地址访问。声明了指向 struct 类型的指针后,通过 -> 访问其中元素。.:变量访问。声明了 struct 类型的变量后,通过 . 访问其中元素。
#include <stdio.h> #include <string.h> typedef struct People { char name[20]; int id; } peo; int main() { struct People p1; peo* p2; strcpy(p1.name, "hello"); p1.id = 666; printf("%s, %d\n", p1.name, p1.id); p2->id = 888; printf(" %d\n", p2->id); }& 作为单目运算符,后面跟变量时,表示取地址运算符。作为双目运算符时,表示按位与。
* 作为单目运算符,后面跟变量时,表示指针运算符。作为双目运算符时,表示乘法。
转载于:https://www.cnblogs.com/kika/p/10851510.html
