C语言学习栏目目录
目录
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:
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,再使用”。
源码