移位操作符
右移
- 算术右移
右边丢弃,左边补原符号位 - 逻辑右移
右边丢弃,左边补0
左移
左边抛弃,右边补0
位操作符
练习
不创建第三个临时变量,交换两个变量
int a = 10;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
用到了异或计算的性质
编写代码实现:求一个整数存储在内存中的二进制中1的个数。
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
{
count++;
}
}
printf("%d\n", count);
return 0;
}
逻辑操作符
注意:逻辑与如果左边为假,右边的内容就不会再计算;同理,逻辑或如果左边为真,右边的内容就不会再计算
条件操作符
练习
if (a > 5)
b = 3;
else
b = -3;
转换成条件表达式,是什么样?
int main()
{
int a = 7;
int b = 0;
b = (a > 5 ? 3 : -3);
printf("%d\n", b);
return 0;
}
使用条件表达式实现找两个数中较大值
int main()
{
int max = 0;
int a = 20;
int b = 30;
max = (a > b ? a : b);
printf("%d\n", max);
}
逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
访问一个结构的成员
struct Stu
{
char name[20];
int age;
char id[20];
};
int main()
{
struct Stu s1 = { "czx",21,"2015050302012" };
struct Stu* ps = &s1;
printf("%s\n", ps->name);
printf("%s\n", ps->age);
printf("%s\n", ps->id);
printf("%s\n", s1.name);
printf("%s\n", s1.age);
printf("%s\n", s1.id);
}
表达式求解
隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型
提升。
如何进行整体提升呢?
整形提升是按照变量的数据类型的符号位来提升的
算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。