位操作符: & 与 , | 或 , ^ 异或
注:位操作符的操作数必须是整数
实现两个数的交换:
用异或操作符实现交换,这里对异或操作符的运用也挺有意思的,我感觉倒是在一定程度上体现了 异或操作符 存储数据的能力,不过存储的是是否相同,通过和其中一个变量再次比较,就可以得到另一个变量,这一点记在笔记本上了,忘了的话,回看。
求整型存储在内存中的二进制中 1 的个数:
位操作符的优先级低于相等运算符;
右移操作符一般是算术操作符,左边补的是原符号位。
复合赋值符:
+= -= *= /= %= >>= <<= &= |= ^=
赋值操作符可以连续赋值,顺序从右往左,但太支持这种写法。
%p 打印地址。这个是六十四位的,打印的十六进制
单目操作符: 只有一个操作数
! - + & sizeof ~ -- ++ * ( )
sizeof 是一个操作符,不是函数,计算的是变量 / 类型所占内存空间的大小,单位是字节。
strlen是库函数,是用来求字符串长度的,至空白符 ‘ \0 ’结束,中间的有空格什么的也算一个字符
~ : 按二进制取反,原位 1 变 0, 0 变 1;
* :解引用操作符, 指针的那个 *p
():强制类型转换 ,int a = (int)3.14 ,将3.14强制转换成整型。
注意传参是,形参接收的到底是什么,自己现在是知道的,但不能很好的反应过来。
关系操作符: > < >= <= == !=
对于关系操作符,整型的关系比较是可以的,但对于浮点型直接比较大还可以,但如果要进行相等的判断,由于浮点型在内存中的存储方式,一般不可以直接比较,要通过对精度的限制,来进行相等判断,字符串则不可以用这种关系操作符比较。
如: “abc” == “abcde”,这样写是在比较两个字符串的地址,而非判断是否一样。
逻辑操作符: && 逻辑与 || 逻辑或
这里注意 && , || 和 & , | 的区别 ,前者是逻辑操作符,后者是位操作符。
&&的判断是从左向右进行的,如果在判断的过程中,遇到一个假,则后面不再运行。
||的判断是从左向右进行的,如果在判断的过程中,遇到一个真,则后面不再运行。
这里可以看到,由于a等于0,所以运行第一个语句 a++的时候,语句就可以判断为假(逻辑与,有一假则为假),所以后面的b++,d++的语句都没有运行,b,d的值也没有改变。
这里是逻辑或,第一个a++,由于a=0,所以第一个返回值为0,到第二个语句 b++ ,由于b=2,判断为真,语句可以判断为真,所以后面语句不再进行,d的值没有改变。
条件操作符(三目操作符): 有三个操作数 形式: exp1?exp2:exp3
这里下面好像执行的相当于是 int c=b=3;这里有问题不明白
逗号表达式:
exp1,exp2,exp3,.......expN
逗号表达式,就是用逗号隔开的多个表达式;从左向右依次执行,整个表达式的结果就是最后一个表达式的结果。
下面这个例子感觉比较好的反应了逗号表达式的运用,通过对表达式的合理运用,可以使程序变得很简洁。
下标引用:[ ] ,这里注意 7[arr] 的形式也可以,这种形式其实还蛮新奇的。
[ ]是个操作符,arr[7] 好比 *(arr+7),而7[arr] 好比是 *(7+arr)。