c语言让人又爱又恨操作符
c和指针: c被许多人所诟病的一个缺点就是它品种繁多的操作符。c的这个特点使它很难精通。另一方面,c的许多操作符具有其他语言的操作符无可抗衡的价值。
可以看出操作符是c很重要的一部分。
算数操作符
+ - * / %
加减乘除,如果你学过数字电路的话,那就会清楚的知道,计算机在是怎么实现的。如果没的话,也不影响你灵活的使用他们。
注意:%(取模)操作符,必须两边都要是整数。
移位操作符
>> <<
左移:左移一位,右边补0;
右移:
分为 - 逻辑右移和- 算术右移,具体由编译器决定
逻辑右移:右侧丢弃,左侧补0;
算术右移:右侧丢弃,左侧补符号位;
如果你学过51单片机的话,就很清楚左移,右移的好处,要实现流水灯 (*-*);
位操作符
& | ~
把指定位,置1
value = value | 1<<num;
把指定位,清0
value = value & ~(1<<num);
赋值操作符
=
需要注意 赋值时有可能发生 隐式转换 ,比如,getchar 的返回类型为int(因为EOF为int型)
单目操作符
! ++ -(负) & sizeof
~ -- +(正) * (类型)
! 逻辑取反操作:就是!num;如果num是0,则 !num=1; 如果num不为0,不管它为任何数,取反!num=0;(包括负数)
++ 分为 a++:(前置)++a(后置)
– -- 也和++样 a-- ;–a
int a = 10;
int b = 8;
//int c = ++a;//结果为11
int d = a++;//结果为10
int e = --b;
int f = b--;
++ 和 - -的使用要注意:
#include <stdio.h>
int main()
{
//printf("%d",10++)//这是一个错误的例子,我们并不能给一个常量++
int a=10;
// ++a = 10;// ++a是对变量值的拷贝 也就是说++a的结果为常量,不能给常量赋值
//******如果你不能理解的话,可参考《c和指针》p73。和p79,左值和右值;
system("pause");
return 0;
}
- 和 +:正数和负数
sizeof::::我们重点讨论sizeof:::从那些方面可以看出他是操作符而不是函数那下面举例介绍:
#include <stdio.h>
int main()
{
int i = 10;
printf("%d",sizeof i);// 第一点可省略 () 括号
printf("%d",sizeof(int))
return 0;
}
#inlcude <stdio.h>
int main()
{
int i = 10;
int s = 11;
sizeof(s = 2*i);
printf("%d",s);//结果为11,可见sizeof()的表达式并不进行运算。
return 0;
}
** ~** 前面已经介绍,按位取反
* 和 & 解引用操作符:与指针一起使用
int main()
{
int a = 0;
int *p = &a;
*p = 10;// 将a改为10;
}
(类型): 强制类型转换
int a = 5;
a = (float)a;//将a强制转话为 5.0
关系操作符
> >= < <= != ==
一定要注意到:::判断是否相等是(==)双等号,
逻辑操作符
&& ||
与操作 或操作
只有真假两种结果,a && b ,如果a和b都为真,表达式为1,否则表达式为0;
aa||b,如果a和b都为假,表达式为0,否则表达式为1;
条件操作符
a>b?a:b
求a,b中的较大值
逗号操作符(控制求值顺序)
表达式的值就是最后一个表达式的值
while(a=0,b=0,a<10)
{
;//
}
下标引用操作符 arr[ 10];
. 和 ->操作符
#include <stdio.h>
struct stu
{
char name[20];
int age;
};
int mian()
{
struct stu s;
struct stu* ps=&stu;//结构体指针
s.age = 18;//结构成员访问
ps->age=18;
}
总结
通过对操作符的学习我们可以很方便的解决许多问题,比如你可以试试下面几道题:(你也可以在我的GitHub博客找到答案)
// 编写一个函数把指定的值存到这个整数中指定的几位;
//e: 原始值 | 存储值 | 起始位 | 结束位 | 返回值 |
// 0x0 | 0x1 | 4 | 4 | 0x10 |
// 0xffff | 0x123 | 15 | 4 | 0x123f |
// 0xffff | 0x123 | 13 | 9 | 0xc7ff |
//
//1.设置一个make;将要设置的那几位置0,其他值不变;比如:~001111000000000 &
//2.将要往进放的值的对应位调整好对齐。
//3.用make 将放入值的其余位清零; 进行按位与& 0011110000000000
//4.将第三步得到的值,与第一步得到的原值,进行按位or或操作;