单目运算符

单目运算符

C语言大约有40多个运算符,其中有一部分为单目运算符。

单目运算符是只接受一个操作数的运算符,主要包括:
!、++、-、&、sizeof
~、–、 +、* 、(类型)

sizeof 运算符

sizeof运算符以字节为单位,返回运算对象的大小。

递增运算符 ++ P117

将运算对象递增1,既可以出现在运算对象的前面,称为前缀模式;也可以出现在运算对象的后面,称为后缀模式。两种模式的区别在递增行为发生的时间不同。

前缀模式是先对变量进行递增操作,然后再使用变量。
后缀模式是先使用变量,然后再对变量进行递增操作。

举例:

a= 10;
q =2*++a; //首先a递增1,然后2*a, 最后将结果赋值给q
q =2*a++; //首先2*a,然后将结果赋值给q,最后a递增1

这只是举例,实际代码中不要做这种不容易理解的操作。

递减运算符- -

将运算对象递减1,用法与递增运算符相同。
递增运算符和递减运算符都具有很高的结合优先级,仅次于括号。

举例:

a=b*c++;//首先b*c,然后将结果赋值给a,最后c递增1
a=(b*c)++;//无效操作,编译报错

因为递增运算符和递减运算符只能影响一个变量(一个可修改的左值)。而组合b*c不是可修改的左值。

注意:不要混淆运算符的优先级和求值顺序

举例:

data = 2;
n =3;
result = 0;
result= (data + n++)*6;

结果是多少?

分析一下,n的值只有在被使用之后才会递增为4,根据优先级的规定,++只作用于n,不作用于data + n。
此外,还可以根据优先级判断何时使用n的值对表达式求值, 而递增运算符的性质决定了何时递增n的值。
如果,n++是表达式的一部分,可将其视为“先使用n,再递增”; 而++n则表示,“先递增n,再使用”。

编写程序时,一次不要使用太多的运算符。

举例:

if(n<100)
{
	printf(“%d,%d”,n,n*n++;
}

本意是先在屏幕上输出,n,然后输出n的平方。 然后递增n,求下一个。最终实现求100个数的平方。

但是,printf函数不一定会先求n,可能会先求n*n++,然后递增n,再求n输出n。
因为在c语言中,编译器可以选择先对函数中的哪个参数求值,这样做可以提高编译效率。

举例:

sum = num/2 + 5*(1 + num++);

很多人认为,先计算num/2,接着计算5*(1 + num++);
但实际上,编译器可能先计算5*(1 + num++),然后递增num;然后再num/2使用递增后的num的值。
我们是无法保证编译器先执行哪一项的。

问题:不是求完表达式的值再进行递增操作吗?
在有递增递减运算符的地方,到底哪些部分对它来说算是表达式的结束。

建议:

如果一个参数出现在函数的多个实参中,不要对其使用递增和递减运算符。
如果一个变量多次出现在一个表达式中,不要对其使用递增和递减运算符。

取反运算符 !

对操作数(或运算对象)执行 逻辑取反操作,如果操作数为真,其结果为假;
如果操作数为假,其结果为真;

怎么判断操作数是真是假?
这个操作符产生的是一个整形的结果,0或1。

求补运算符 ~

对整形操作数执行求补操作,操作数中原来所有为1的位变为0,为0的位变为1。

正负操作符 + -

在基本运算符中已经介绍,+只是为了与-对应,组成一对。

取址操作符 &

产生它的操作数的地址。

间接访问操作符(解引用操作符) *

与指针一起使用,用于访问指针多指向的值

强制类型转换符 “(类型)”

显式的把表达式的值转换为另外的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiawucha159

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值