C语言操作符的简单学习

1.算数操作符

C提供了所有常用的算术操作符: + - * / %
除了%操作符,其余几个操作符都是既适用于浮点类型又适用于整数类型。当/操作符的两个操作数都是整数时,它执行整除运算,在其他情况下则执行浮点数除法。%为取模操作符,它接受两个整型操作数,把左操作数除以右操作数,但它返回的值是余数而不是商。

2.移位操作符

<<左移操作符
>>右移操作符
移位操作只是简单地把一个值的位向左或向右移动。在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。如图是一个左移位的例子,它在一个8位的值上进行左移3位的操作,以二进制形式显示。这个值所有的位均向左移3个位置,移出左边界的那几个位丢失,右边空出来的几个位则用0补齐。
这里写图片描述
右移位操作存在一个左移位操作不曾面临的问题:从左边移入新位时,可以选择两种方案。一
种是逻辑移位,左边移入的位用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保持原数的正负形式不变。如果值10010110右移两位,逻辑移位的结果是00100101,但算术移位的结果是11100101。算术左移和逻辑左移是相同的,它们只在右移时不同,而且只有当操作数是负值时才不一样。

警告:对于移位运算符不要移动负数位,这个是标准未定义的。

例如:
int num = 10;
num>>-1;//error

3.位操作符

位操作符有:“&” –按位与 , “|” –按位或, “^”–按位异或。

位操作符对它们的操作数的各个位执行AND、OR和XOR (异或)等逻辑操作。当两个位进行AND操作时,如果两个位都是1,结果为1,否则结果为0。当两个位进行OR操作时,如果两个位都是0,结果为0,否则结果为1.最后,当两个位进行XOR操作时,如果两个位不同,结果为1,如果两个位相同,结果为0。这些操作以图表的形式总结如下。
这里写图片描述

4.赋值操作符

赋值操作用“=”表示,赋值是表达式的一种,而不是某种类型的语句。所以,只要是允许出现表达式的地方,都允许进行赋值。
举几个例子:
a = x = y + 3;
它的意思和如下语句完全相同:
x = y + 3;
a = x;
下面是一个稍复杂的例子:
t = s + ( t = u - v ) / 3;
它也可以这样写:
t = u - v:
r = s + t / 3;
事实上,后面这种写法更好一些,更易于阅读和调试。

复合赋值符

+=-+*=/=%=<<=>>=&=^=|=
在这里只讨论一下+=操作符,其余操作符都与其类似。
+= 操作符用法如下:
a += 1;
它读作“把1加到a”,它的功能相当于下面的表达式:
a = a + 1;

5.单目操作符

单目操作符就是只接受一个操作数的操作符。他们是:
逻辑反操作 , - 负值, + 正值 , & 取地址, ~ 对一个数的二进制按位取反 , * 间接访问操作符(解引用操作符), 前置、后置– , ++ 前置、后置++, sizeof 操作数的类型长度(以字节为单位 , (类型) 强制类型转换 。

逐个来介绍这些操作符。
! 操作符对它的操作数执行逻辑反操作;如果操作数为真,其结果为假,如果操作数为假,其结果为真。和关系操作符一样,这个操作符实际上产生一个整型结果,0或1。
~操作符对整型类型的操作数进行求补操作,操作数中所有原先为1的位变为0,所有原先为0的位变为1。
-操作符产生操作数的负值。
+操作符产生操作数的值;换句话说,它什么也不干。之所以提供这个操作符,是为了与-操作符组成对称的一对。
&操作符产生它的操作数的地址。例如,‘下 面的语句声明了一个整型变量和一个指向整型变量的指针。接着,&操作符取变量a的地址, 并把它赋值给指针变量。
int a, *b;
b = &a;
这个例子说明了你如何把一个现有变量的地址赋值给-一个指针变量。
*操作符是间接访问操作符,它与指针一起使用,用于访问指针所指向的值。在前面例子中的赋值操作完成之后,表达式b的值是变量a的地址,但表达式*b的值则是变量a的值。
sizeof操作符判断它的操作数的类型长度,以字节为单位表示。操作数既可以是个表达式(常常是单个变量),也可以是两边加上括号的类型名。这里有两个例子:
sizeof ( int ) sizeof x
第1个表达式返回整型变量的字节数,其结果自然取决于你所使用的环境。第2个表达式返回变量x所占据的字节数。注意, 从定义上说,字符变量的长度为1个字节。当sizeof的操作数是个数组名时,它返回该数组的长度, 以字节为单位。在表达式的操作数两边加上括号也是合法的,如下所示:
sizeof( X )
这是因为括号在表达式中总是合法的。判断表达式的长度并不需要对表达式进行求值,所以 sizeof( a=b+ 1)并没有向a赋任何值。
(类型)操作符被称为强制类型转换(cast),它用于显式地把表达式的值转换为另外的类型。例如,为了获得整型变量a对应的浮点数值,你可以这样写
(float)a
强制类型转换这个名字很容易记忆, 它具有很高的优先级, 所以把强制类型转换放在一个表达式前面只会改变表达式的第1个项目的类型。如果要对整个表达式的结果进行强制类型转换, 你必须把整个表达式用括号括起来。
- -+ +运算符
例:
int a = 1;
b = ++a; //先对a进行自增,然后使用a,也就是表达式的值是a自增后的值,b的值为2。

int a = 1;
b = a++; //对a先使用再增加,这样b的值是1,之后a变成2.

- -则同理。

6.关系操作符

关系操作符有> , < ,>= ,<= ,!= ,==
!=操作符用于测试“不相等”,而==操作符用于测试“相等”。
注意一些是勇士的陷阱:
x = get_value();
if(x = 5)
//处理事务.
细心的人已经发现问题出在哪了,这个代码将==写错成=,因此无论x的值是多少,当他进入判断时会被赋值为5,程序陷入死循环。切记不要写错。

7.逻辑操作符

逻辑操作符有:&& 逻辑与,|| 逻辑或。
exp1 && exp2
若两表达式值都为真,那么整个表达式的值就是真的。若两表达式任意一个为假,那么整个表达式为假。
exp1 && exp2
若两表达式值都为假,那么整个表达式的值就是假的。若两表达式任意一个为真,那么整个表达式为真。

8.条件操作符

exp1 ? exp2 : exp3
如果exp1为真,则执行exp2,否则执行exp3。
例如:
①if(a > 5)
b=3;
else
b=4;
②b = a > 5 ? 3 : 4;
这两个代码实现的功能完全相同。

9.逗号操作符

exp1,exp2,…,expn
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

10.下标引用、函数调用和结构成员

1.[ ]
操作数:一个数组名+一个索引值
int arr[10];// 创建数组
arr[9] = 10;//实用下标引用操作符。[ ] 的两个操作数是arr和9。
2.( )
函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员
结构体.成员名
->结构体指针->成员名

#include <stdio.h>
struct Stu
{
    char name[10]; 
    int age;
    char sex[5]; 
    double  score; 
};

void set_agel(struct Stu stu)
{
    stu.age = 18;
}

void set_age2(struct Stu* pStu)
{
    pStu->age = 18;// 结构成员访问
}
int main()
{
    struct  Stu  stu;
    struct Stu* pStu = &stu;//结构成员访问
    stu.age = 20;//结构成员访问set_ age1(stu);
    pStu->age = 20;//结构成员访问set_ age2(pStu);return 0;
}

11.操作符的属性

复杂表达式的求值顺序是由3个因素决定的:操作符的优先级、操作符的结合性以及操作符是否控制执行的顺序。两个相邻的操作符哪个先执行取决于它们的优先级,如果两者的优先级相同,那么它们的执行顺序由它们的结合性决定。简单地说,结合性就是一串操作符是从左向右依次执行还是从右向左逐个执行。最后,有4个操作符,它们可以对整个表达式的求值顺序施加控制,它们或者保证某个子表达式能够在另一个子表达式的所有求值过程完成之前进行求值,或者可能使某个表达式被完全跳过不再求值。
每个操作符的所有属性都列在如下表所示的优先级表中。表中各个列分别代表操作符、它的功能简述、用法示例、它的结果类型、它的结合性以及当它出现时是否会对表达式的求值顺序施加控制。用法示例提示它是否需要操作数为左值。术语lexp表赫左值表达式,rexp 表示右值表达式。记住,左值意味着一个位置,而右值意味着一个值。所以,在使用右值的地方也可以使用左值,但是在需要左值的地方不能使用右值。
这里写图片描述
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值