操作符分类:
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用,函数调用和结构成员
算术操作符(+ - * / %)
1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
2.对于/操作符,如果两个操作符都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。
#include<stdio.h>
int main()
{
int a = 5 / 2;//商2余1
int b = 5 % 2;//商2余1
double c = 5 / 2.0;
printf("a=%d\n", a);//2
printf("a=%d\n", b);//1
printf("a=%lf\n", c);//2.500000
return 0;
}
位移操作符(<< --左移操作符 >> --右移操作符)
警告:对于移位操作符,不要移动负数位,这个是标准未定义的。
右移操作符 向右移动1位有/2(除以2)的效果 --通常都是算术右移
1.算术右移(正数--符号位是0 负数--符号位是1) 规则:右边丢弃,左边补原符号位
2.逻辑右移 规则:右边丢弃,左边补0
#include<stdio.h>
int main()
{
int a = 16;
// >> -右移操作符
//移动的是二进制位
//00000000000000000000000000010000
//00000000000000000000000000001000
int b = a >> 1;
printf("%d\n", b);//8
return 0;
}
#include<stdio.h>
int main()
{
int a = -1;
//整数的二进制表示有:原码,反码,补码
//存储到内存中的是补码
//正整数的原反补是相同的
//10000000000000000000000000000001 --原码
//11111111111111111111111111111110 --反码 符号位不变,其他位按位取反
//11111111111111111111111111111111 --补码 反码+1
//11111111111111111111111111111111
int b = a >> 1;
printf("%d\n", b);
return 0;
}
左移操作符 向左移动1位有*2(乘2)的效果
规则:左边丢弃,右边补0
#include<stdio.h>
int main()
{
int a = 5;
int b = a << 1;
//00000000000000000000000000000101
//00000000000000000000000000001010
printf("%d\n",b);//10
return 0;
}
位操作符(&-按位与 |-按位或 ^-按位异或)
//& -按位(二进制位)与
#include<stdio.h>
int main()
{
int a = 3; //00000000000000000000000000000011
int b = 5; //00000000000000000000000000000101
int c = a & b; //00000000000000000000000000000001
printf("%d\n", c);//1
return 0;
}
//| -按位(二进制位)或
#include<stdio.h>
int main()
{
int a = 3; //00000000000000000000000000000011
int b = 5; //00000000000000000000000000000101
int c = a | b;//00000000000000000000000000000111
printf("%d\n", c);//7
return 0;
}
//^ -按位(二进制位)异或
//相同为0,相异为1
#include<stdio.h>
int main()
{
int a = 3; //00000000000000000000000000000011
int b = 5; //00000000000000000000000000000101
int c = a ^ b; //00000000000000000000000000000110
printf("%d\n", c);//6
return 0;
}
一套变态的面试题
不能创建临时变量(第三个变量),实现两个数的交换
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int tmp = 0;
printf("before:a=%d b=%d", a, b);
tmp = a;
a = b;
b = tmp;
printf("after:a=%d b=%d", a, b);
return 0;
}
//加减法
//缺陷:可能会溢出
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("a=%d,b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a=%d,b=%d\n", a, b);
return 0;
}
//按位异或(面试可能会考)
//缺陷:执行效率不高,可读性较差
#include<stdio.h>
int main()
{
int a = 3; //011
int b = 5; //101
printf("before:a=%d b=%d", a, b);
a = a ^ b; //110
b = a ^ b; //011
a = a ^ b; //101
printf("after:a=%d b=%d", a, b);
return 0;
}
练习
编写代码实现:求一个整数存储在内存中的二进制中1的个数
//这种方法存在问题
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
//统计num的补码中有几个1
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("%d\n", count);
return 0;
}
#include<stdio.h>
int main()
{
int num = 0;
int count = 0;
int i = 0;
scanf("%d", &num);
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
count++;
}
printf("%d\n", count);
return 0;
}
赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
#include<stdio.h>
int main()
{
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符。
return 0;
}
复合赋值符(+= -= /= %= <<= >>= &= \= ^=)
#include<stdio.h>
int main()
{
int a = 10;
a = a + 2;
a += 2;//符合赋值符
a = a >> 1;
a >>= 1;
a = a & 1;
a &= 1;
return 0;
}
单目操作符 --只有一个操作数
a+b --有两个操作数 +是双目操作符
- !--逻辑反操作符
- - --负值
- + --正值
- & --取地址
- sizeof --操作数的类型长度(以字节为单位)
- ~ --对一个数的二进制按位取反
- -- --前置、后置--
- ++ --前置、后置++
- * --间接访问操作符(解引用操作符)
- (类型) --强制类型转换
//! --逻辑反操作符
#include<stdio.h>
int main()
{
int a = 0;
if (!a)
{
printf("呵呵\n");//a为假,打印呵呵
}
if (a)
{
printf("呵呵\n");//a为真,打印呵呵
}
//printf("%d\n", !a);
return 0;
}
//- --负值
#include<stdio.h>
int main()
{
int a = -5;
a = -a;
printf("%d\n", a);
}
//& --取地址操作符
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;
*p=20;//解引用操作符
printf("%d\n", a);
}
//sizeof 计算变量所占内存空间的大小,单位是字节
#include<stdio.h>
int main()
{
int a = 10;
char c = 'r';
char* p = &c;
int arr[10] = { 0 };
printf("%d\n", sizeof a);//4
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(c));//1
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(p));//4/8
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(arr));//40
printf("%d\n", sizeof(int[10]));//数组去掉数组名就是数组的类型
return 0;
}
注:数组是有类型的,数组去掉数组名就是数组的类型
标签:int,C语言,--,详解,操作符,includeint,printf,main From: https://blog.51cto.com/u_15848198/5931567