-
位运算符
针对二进制数的运算
(1)位与:&
对应位都为 1, 则结果为 1(2)位或:|
对应位有 1, 则结果为 1(3)位反:~
按位取反计算机时补码存储,原码输出!
原码:
正数的原码是其本身
负数的原码是正数源码的基础上,符号位为 1
反码:
正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余位按位取反
补码:
正数的补码是其本身
负数的补码是在其原码的基础上,符号位不变,其余各位取反然后加 1
即反码的基础上加 1例如:23
0001 1000 - 1
23: 0001 0111
~23: 1110 1000 (补码) //补码 = 反码 + 1 ===> 反码 = 补码 - 1
1110 0111 (反码)
1001 1000 (原码) // -24(4)异或:^
对应位相同则结果为 0,不同为 14 ^ 7 = 3
0100
^0111
--------
00115 ^ 3 = 6
0101
^0011
-------
01103210
1111 ----> 1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1*2^3
8421 ----> 1 + 2 + 4 + 8(5)左移:<<
将数据左移相应的位数,低位补0, 高位溢出,
即: 乘以 2^n4 << 2 ===> 0100 << 2 ===> 01 0000
或者 : 4 * 2^2 = 4 * 4 = 16
(6)右移:>>
右移相应的位数,即处以 2^n0100 >> 2 ===> 0001 ===> 1
4 >> 2 ===> 4 / 2^2 = 4/4 = 1将 123 的第四位置 0
0000 0000 1000 0000 = 128
0000 0000 0111 1111 = 127
0000 0000 0111 1011 = 1231111 1111 1111 0111
0xfff7不考虑其他位,只将第四位置 0,(从 0 开始2^0, 2^1, 2^2, 2^3, 2^4)
123 & (0x0 << 4) -
赋值运算符
简单赋值运算符:=
复合赋值运算符:
+=, -=, *=, /=, %=
&=, |=, ~=, <<=, >>=m += n ===> m = m + n
m >>= n ===> m = m >> n
m &= n ===> m = m & n左值:
赋值号左侧的值,仅变量可以作为左值
表达式的值不可作为左值
右值:
赋值号右侧的表达式,变量, 或值,左值,均可作为右值 -
运算符的优先级
括号成员第一,全体单目第二,乘除余三,加减四
位移五,关系六,等(==)与不等(!=)排第七
位与,异或和位或八九十
逻辑与和或十一与十二
条件(?:)高于赋值,逗号运算最低int a = 1,2,3,4,5; //如果逗号运算符高于赋值运算符,则正确编译,a = 5
int b = 1,2,3,4,5; //如果赋值运算符高于逗号运算符,则无法正确编译
int c = (12, 34, 56); //OK, c = 56; -
选择结构
(1)C 语言的三大结构
顺序结构
选择结构
循环结构
(2)if 的使用
a. 基本用法
if(表达式)
{
//代码块,即要执行的代码
}
如果表达式的结果为真,则执行 if 之后 {} 里的内容
否则不执行
b. if~else
if(表达式)
{
//codeBlocks1
}
else
{
//codeBlocks2
}
表达式成立 ,则执行 codeBlocks1
表达式不成立,则执行 codeBlocks2
思考:
输入一个数,判断该数是否是 3 的倍数???
若是则输出该数,否则输出 false
c. if ~ else 的嵌套使用
if(表达式1)
{
//codeBlocks1
if(表达式2)
{
//codeBlocks2
}
//other codeBlock
}
else
{
if(表达式2)
{
//codeBlock3
}
else
{
//codeBlocks4
}
}