6.1 特殊运算符

 

C语言学习栏目目录

目录

1、sizeof运算符和size_t类型

2、求模运算符:%

3、递增运算符:++

4 、递减运算符:--

5、 优先级


C语言有大约40个运算符,有些运算符比其他运算符常用得多。前面讨 论的是最常用的,本节再介绍4个比较有用的运算符。

 

1、sizeof运算符和size_t类型

前面我们就见过sizeof运算符。回顾一下,sizeof运算符以字节为单 位返回运算对象的大小(在C中,1字节定义为char类型占用的空间大小。过 去,1字节通常是8位,但是一些字符集可能使用更大的字节)。运算对象可 以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如, float),则必须用圆括号将其括起来。程序清单6.1演示了这两种用法。

 

程序清单6.1 sizeof.c程序

#include <stdio.h>
/************************************************************************
功能:使用sizeof运算符
************************************************************************/
int main()
{
	//  使用C99新增的%zd转换说明  --  如果编译器不支持%zd,请将其改 成%u或%lu
	int n  = 0;
	size_t intsize;
	intsize = sizeof (int);
	printf("n = %d, n 有 %zd 个 bytes; 整个 ints 有 %zd 个 bytes.\n", n,sizeof n,intsize);

	//暂停控制台
	system("pause");

	return 0;
}

 

C 语言规定,sizeof 返回 size_t 类型的值。这是一个无符号整数类型, 但它不是新类型。前面介绍过,size_t是语言定义的标准类型。

2、求模运算符:%

 

模运算符(modulus operator)用于整数运算。求模运算符给出其左侧 整数除以右侧整数的余数(remainder)。例如,13 % 5(读作“13求模5”)得3,因为13比5的两倍多3,即13除以5的余数是3。求模运算符只能用于整 数,不能用于浮点数。

 

负数求模如何进行?C99规定“趋零截断”之前,该问题的处理方法很 多。但自从有了这条规则之后,如果第1个运算对象是负数,那么求模的结 果为负数;如果第1个运算对象是正数,那么求模的结果也是正数:

11 / 5得2,11 % 5得1

11 / -5得-2,11 % -2得1

-11 / -5得2,-11 % -5得-1

-11 / 5得-2,-11 % 5得-1

如果当前系统不支持C99标准,会显示不同的结果。实际上,标准规定:无论何种情况,只要a和b都是整数值,便可通过a - (a/b)*b来计算a%b。例如,可以这样计算-11%5: 

-11 - (-11/5) * 5 = -11 -(-2)*5 = -11 -(-10) = -1

3、递增运算符:++

 

递增运算符(increment operator)执行简单的任务,将其运算对象递增 1。该运算符以两种方式出现。第1种方式,++出现在其作用的变量前面,这是前缀模式;第2种方式,++出现在其作用的变量后面,这是后缀模式。 两种模式的区别在于递增行为发生的时间不同。我们先解释它们的相似之 处,再分析它们不同之处。程序清单6.3中的程序示例演示了递增运算符是 如何工作的。

 

程序清单6.3 add_one.c程序

#include <stdio.h>
/************************************************************************
功能:使用sizeof运算符
************************************************************************/
int main(void)
{
	int ultra = 0,super = 0; 
	while(super < 5)
	{
		super++;
		++ultra;
		printf("super = %d, ultra = %d \n", super, ultra);
	}
	//暂停控制台
	system("pause");
	return 0;

}

 

运行该程序后,其输出如下:

super = 1, ultra = 1 
super = 2, ultra = 2 
super = 3, ultra = 3 
super = 4, ultra = 4 
super = 5, ultra = 5 
请按任意键继续. . .

 

该程序两次同时计数到5。用下面两条语句分别代替程序中的两条递增 语句,程序的输出相同:

super = super + 1; 
ultra = ultra + 1;

 

4 、递减运算符:--

 

每种形式的递增运算符都有一个递减运算符(decrement operator)与之 对应,用--代替++即可:

--count; // 前缀形式的递减运算符
count--; // 后缀形式的递减运算符

使用同 ++ 表达式;

不建议++和--不要和其他运算符在同一个表达式使用,容易出错。也不容易代码阅读和维护。

 

5、 优先级

 

递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级 比它们高。因此,x*y++表示的是(x)*(y++),而不是(x+y)++。不过后者无效,因为递增和递减运算符只能影响一个变量(或者,更普遍地说,只能影 响一个可修改的左值),而组合x*y本身不是可修改的左值。不要混淆这两个运算符的优先级和它们的求值顺序。假设有如下语句:

y = 2;
n = 3;
nextnum = (y + n++)*6;

 

nextnum的值是多少?把y和n的值带入上面的第3条语句得:

nextnum = (2 + 3)*6 = 5*6 = 30 

 

n的值只有在被使用之后才会递增为4。根据优先级的规定,++只作用于n,不作用与y + n。除此之外,根据优先级可以判断何时使用n的值对表达 式求值,而递增运算符的性质决定了何时递增n的值。

如果n++是表达式的一部分,可将其视为“先使用n,再递增”;而++n则表示“先递增n,再使用”。

 

源码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值