运算符
运算符
C语言为处理数据提供了大量的操作,可以在程序中进行算术运算,比较值的大小,修改变量,逻辑的组合关系等。
基本运算符
基本运算的运算符有:=, +, -, *, /(C没有指数运算符。不过C的标准库中提供了一个pow()函数用于指数运算。例如:pow(3, 4)返回3的4次幂)。
赋值运算符:=
在C语言中, “=”并不意味着相等,而是赋值。
months = 12;
意为把值12赋给months这个变量。
在C语言中,12 = months;这样的语句没有意义。 因为12被称为右值(rvalue),只能是字面常量,不能给常量赋值,常量本身就是它的值。概括地说,C使用可修改的左值(modifiable lvalue)标记那些可赋值的实体。
几个术语:数据对象,左值,右值和运算符
赋值表达式语句的目的是把值存储到内存位置上。用于存储值的数据存储区统称为数据对象(data object)。对象指的是实际的数据存储,而左值是用于标识或定位存储位置的标签。
对于早期的C语言,提到左值意为着:
1.它指定一个对象,可以引用内存中的地址;
2.它可用在赋值运算符的左侧。
之后由于const的存在,C标准新增了一个术语:可修改的左值,用于标识可修改的对象。
右值指的是能赋值给可修改的左值的量,且本身不是左值。
在学习名称时,被称为项的就是运算对象。运算对象是运算符操作的对象。
加法运算符:+
加法运算符用于加法运算,使其两侧的值相加。
相加的值(运算对象)可以是变量,也可以是常量。
减法运算符:-
减法运算符用于减法运算,使其左侧的数减去右侧的数。例如:
i = 13 - 2;
+ 和 -运算符都被称为二元运算符,即这些运算符需要两个运算对象才能完成。
符号运算符:-和+
减号还可用于标明或改变一个值的代数符号。例如:
rocky = -12;
smokey = -rocky;
以这种方式使用的负号被称为一元运算符,即只需要一个运算对象。
乘法运算符:*
例:cm = 2.54 * inch;
除法运算符:/
/左侧的值是被除数,右侧的值是除数。整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法结果是整数。整数除法结果的小数部分被丢弃,这一过程被称为截断。
#include<stdio.h>
int main(void)
{
printf("5 / 3 = %d\n", 5 / 3);
printf("6 / 3 = %d\n", 6 / 3);
printf("5. / 3 = %1.2f\n", 5. / 3);
printf("5. / 3. = %1.2f\n", 5. / 3.);
return 0;
}
运行结果
运算符优先级
优先级(从高到低)
运算符 | 结合律 |
---|---|
() | 从左往右 |
+ - (一元) | 从右往左 |
* / | 从左往右 |
+ -(二元) | 从左往右 |
= | 从右往左 |
其他运算符
C语言大约有40个运算符,介绍4个常用的.
sizeof运算符和size_t类型
sizeof运算符以字节为单位返回运算对象的大小。
运算对象可以是具体的数据对象或类型。如果运算对象是类型(如 int),则必须用圆括号将其括起来。
求模运算符
求模运算符用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数。如,13 % 5 得3。
标准规定:无论任何情况,只要a 和b 都是整数值,便可通过
a - (a / b) * b来计算a % b。
递增运算符:++
递增运算符执行简单的任务:将其运算对象递增1,该运算符一两种形式出现。
前缀模式:++count;
后缀模式:count++;
两种模式区别在于递增行为发生的时间不同。
例如:
#include<stdio.h>
int main(void)
{
int a = 1, b = 1;
int pre_a = 0, b_post = 0;
pre_a = ++a; //前缀模式
b_post = b++; //后缀模式
printf(" a b pre_a b_post\n");
printf("%4d%4d %4d %4d\n", a, b, pre_a, b_post);
return 0;
}
运行结果
#include<stdio.h>
int main(void)
{
int ar[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = ar;
int* s = ar;
printf("*p++ *++s\n");
printf("%4d %6d\n", *p++, *++s);
return 0;
}
运行结果
递减运算符: –
每种形式的递增运算符都有一个递减运算符与之对应,即:
前缀模式:–count;
后缀模式:count–;
优先级
递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比他们高。因此:x * y++表示(x) (y++)。而不是(xy)++。
不过后者无效,因为递增和递减运算符只能影响一个变量(即只能影响一个可修改的左值),而组合x*y不是可修改的左值。
小结
C通过运算符提供多种操作。每个运算符的特性包括运算对象的数量,优先级和结合律。当两个运算符共享一个运算对象时,优先级和结合律决定了先进行哪项运算。