雄关漫道真如铁,而今迈步从头越
老铁们,咱们上一篇文章把C语言语句的知识点给过了一遍,今天我们就从单目 *** 作符与双目 *** 作符和三目 *** 作符来说一说 *** 作符,咱们开始吧!
一、单目 *** 作符二、双目 *** 作符
1、算术运算符2、关系运算符3、逻辑 *** 作符 三、三目 *** 作符--条件 *** 作符四、逗号运算符五、初等运算符--下标引用,函数调用和结构体成员六、位运算符
一、单目 *** 作符单目运算符就是只有一个 *** 作数
我们现在具体看一下这些 *** 作符(前面的几个比较好理解,我们从后面的挑几个说):
前置++和后置++
有什么区别?前置++就是先自增一,再使用,后置++就是先使用,再自增一。
前置- - 和后置- -
一样的,在前面就先减再用,在后面就先用再减。
但是注意,像这种错误的代码没必要研究,不同的编译器可能结果不一样:
int a = 1; int b = (++a) + (++a) + (++a);//2+3+4 printf("%dn", b);
关于自增和自减,我们只需要明白什么时候增,什么时候减就好了。
至于解引用 *** 作符,就可以理解为取出地址上的值,进行使用,一般用于指针。更详细的说明,我们会在指针的文章里深入探讨
这些 *** 作符,称为单目是因为只对一个数据进行 *** 作,所以,不要记混了双目 *** 作符和单目 *** 作符的概念呀!
二、双目 *** 作符 1、算术运算符算数运算符的运算次序就是我们小学到现在一直使用的次序。
2、关系运算符C语言提供6种关系运算符,如表所示:
(注意加黑的地方,不要写错表达式了,特别是 赋值表达式 一个 = 和 等于 两个 = =)
这里注意一点:
关系运算符的值只能是0或1。
关系运算符的值为真时,结果值都为1。
关系运算符的值为假时,结果值都为0。
前4种关系运算符的优先级别相同,后两种也相同。前四种高于后两种。
关系运算符的优先级低于算术运算符。
关系运算符的优先级高于赋值运算符。
逻辑 *** 作符只有三个,一个是与 ” && “ 一个是或 “ || ”。
另一个是单目运算符里的非 “ !”
&& 的判断顺序是从左至右,如果左边判断为假,那么右边不判断。
|| 判断顺序不区分,两边都要判断,即使左边为假,也继续判断右边的真假。
**exp1 ? exp2 : exp3 **
(exp就是expression,即表达式)
这也是C语言里唯一一个三目 *** 作符。
意思是:如果表达式1的结果为真,就计算表达式2,否则计算表达式3 。
例如:
int main() { int a = 4; int b = 3; int c = 5; int d = 6; int e; e = a > b ? c > d ? d > a:c:b; printf("%dn", e);//结果是5 return 0; }
为什么结果是5?我们首先对式子进行切割:
e = (a > b ) ? ( c > d ? d > a : c) : b ;
这是第一步切割,我们发现应该计算第二个表达式:
(c > d ) ? ( d > a ) : c
这一步我们发现c>d为假,所以取第三个表达式,就是c,那么最终结果也就是c。
将这个表达式作为一个整体,就不会出错了。
四、逗号运算符(exp1,exp2,exp3,exp4…)
这个就是逗号表达式了,注意,里面同样的,可以有很多表达式。
逗号表达式的特点:表达式从左向右依次计算,是最后一个表达式的结果
int main() { int a = 3; int b = 20; int c = 0; int d; d = (a -= 3, b += a, c = a - b, b = a - 4); //计算下来 a = 0, b = 20 , c = -20 , b = -4 printf("%dn", d); //逗号表达式的特点:表达式从左向右依次计算,是最后一个表达式的结果 return 0; }
所以这段代码的最终结果也就是-4。
五、初等运算符–下标引用,函数调用和结构体成员()这个是函数调用使用的运算符
int main(){......}
[]这个是下标引用运算符,一般用于数组的 *** 作
int arr[10] = { 0 }; int b = arr[5]; printf("%dn",b);
[ . ]是结构体成员访问:
#includetypedef struct StudentInfo { int age; char *name; char *ID; }StudentInfo; StudentInfo s; int main() { s.age = 20; s.name = "xiaohong"; s.ID = "98765432112345"; printf("%d %s %sn", s.age, s.name, s.ID); return 0; }
[ -> ]是结构体指针成员的访问:
#include#include typedef struct StudentInfo { int age; char *name; char *ID; }StudentInfo; StudentInfo s; int main() { StudentInfo* ps = &s; ps->age = 19; ps->name = "xiaoming"; ps->ID = "12345678901234"; printf("%d %s %sn",ps->age,ps->name,ps->ID); return 0; }
== 至于 [ -> ]和 [ . ] 这两个 *** 作符的更加详细的说明,我们会在结构体的文章里说明。==
六、位运算符位运算就是基于二进制的运算,一般用的不是很多(笔者有一篇哈夫曼压缩的文章,用到了位运算)
按位与运算符【&】
按位异或运算符【^】
按位或运算符【|】
左移动运算符【<<】
右移动运算符【>>】
我们用实际代码和来说明这些运算符的作用:
int main() { int a = 1; int b = 4; printf("%dn", a & b);//0 printf("%dn", a ^ b);//5 printf("%dn", a | b);//5 int c = 2; printf("%dn", c << 2);//8 printf("%dn", c >> 2);//0 return 0; }
这些代码后面已经跟上了结果,现在我们来分析一下结果:
由于位运算基于二进制,所以我们先看看a,b,c的二进制都是多少:
a – 00000001
b – 00000100
c – 00000010
现在我们来看一看a&b是什么,
a&b,也就是一个新的二进制:00000000,这个二进制数的值是0
之后是a^b,异或,就是两个不一样就取1,两个一样就取0(一男一女生孩子):
a^b,新的二进制是:00000101,这个二进制数的值是5
之后是“按位或”,”按位或“是能取啥就取啥,有1就一定取:
a|b,新的二进制是: 00000101,值也是5(注意区分它和异或的区别)
然后就到了位移运算,这个就相对简单一点,
c << 2,数字左移2位,二进制就变成了 00001000,也就是8,
c >> 2,数字右移2位,二进制就变成了 00000000,也就是0。
今天的分享也就到这里了,希望带来了帮助!也祝大家小年快乐!
至此,我们就把C语言中所有能见到的运算符给说了一遍,欢迎指正批评哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)