1.移位操作符
作用的对象是数的二进制位。
(1):>>
向左边移动一位,左边丢弃,右边补0;相当于这个数乘以2移动n位,相当于乘以2的n次方。
int main()
{
int a=2;
int b=a<<1;//打a的二进制向左移动一位
printf("b=%d",b);
return 0;
}

(2)>>
向右边移动,因为二进制位的第一个数表示数的正负,所以向右移时分为两种情况;
1.算术右移:右边丢弃,左边补原符号位(1表示负数,0表示整数)
2.逻辑右移:右边丢弃,左边补0.

?在vs编译器下采用的是算术右移;
(3)数的原码,补码,反码:
?2.逗号表达式
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6??c = 6
b = ++c, c++, ++a, a++;
// 逗号表达式的优先级,最低,这里先算b=++c, b得到的是++c后的结果,b是7
// b=++c 和后边的构成逗号表达式,依次从左向右计算的。
// 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7
b += a++ + c;?// a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9
printf("a = %d b = %d c = %d\n:", a, b, c);?// a:9, b:23, c:8
return 0;
}
题目:以下程序的输出结果是:
int main()
{
int x,y,z;
x=1;
y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x,y,z);
return 0;
}
[A]2,3,3 [B]2,3,2 [C]2,3,1 [D]1,1,1
//解析:
//x和y的值经过自增以后分别为2和3,D可以排除。剩下3个选项选择什么呢?
//如果是(x++,y++,++y)实际上可以看成(1,1,3)整个逗号表达式的值应该是3,那么选A。
//如果是(x++,++y,y++)实际上可以看成(1,2,2)整个逗号表达式的值应该是2,那么选B。
//但这是错的,这儿还有赋值运算符。赋值运算符的优先级是14,而逗号表达式的优先级是15,也就是说上面的
//表达式中应该等价于这样的结合:(z=x++),y++,++y;如果这样写的话,则答案很清晰,为:2,3,1.正确
//答案选C。
3.逻辑运算:
逻辑运算符&&:
例1.
?&&为并且符号,全部为真才为真。而a++是先用再加。所以第一个a++为0,为假;所以后面的计算都不会继续,所以a=1;
结果为:1 2 3 4
例2.

逻辑运算符||
例3.
结果为2 2 3 4
原因:在计算过程中,a++的结果为1,表示真;而在||运算中,出现真就表示真,所以后面的结果都没有计算。a=2;
总结:不论是&&还是||,只要出现了确切的结果就不会继续计算。比如1.中,a++的结果为0,并且为&&逻辑运算符,则出现假结果为假,所以后面不会计算。
3.中为||运算,而a++的结果为1,表示真,整个式子结果为真,所以后面不会继续计算。
4.整数提升
int main()
{
char a=5;
char b=126;
char c=a+b;
printf("%d",c);
return 0;
}
?程序的运行结果为-125;
运算过程:
int main()
{
char a=5;
char b=126;
char c=a+b;
printf("%d\n",c);->-125
}
计算过程:
char a的原码为 00000101;
由于CPU计算都是以int型进行计算,因为cpu用int类型计算的速度最快。所以char通过整数提升的方式变为
00000000000000000000000000000101;
同样b为
00000000000000000000000001111110;
所以a+b为
00000000000000000000000010000011;
c为char类型为8个二进制位
10000011
在char类型中为一个负数,所以在符号位前面添1;
11111111111111111111111110000011;在计算机中以补码形式储存
11111111111111111111111110000010;反码
10000000000000000000000001111101;原码->-125
整数提升的实例:
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
return 0;
}
//最后的结果是输出'c',由于整数提升,char和short类型的变量在计算机内部
//存储的方式发生了变化。

?整数提升的规则:

?
|