运算符大全
在第三章里已经提到了C语言中的数据类型和对应的常量与变量,这是C语言中的两种最基本的数据对象。在使用一个变量前,需要对变量先进行声明,甚至还需要对变量赋一个初值,比如下面的语句就声明了2个整型变量:
int a;
int b = 100;
上面两条C语言语句,第一句声明了一个整型变量a,但是没有给a赋初值,所以这个时候a的值是一个任何可能的值,是随机的,也叫垃圾值;第二句声明了一个整型变量b,并且在声明的同时还给b设置了一个初始值100。在完成了对变量a和b的声明之后,就可以在程序中按照a和b的作用域来使用它了。
有了变量和常量来存放和表现数据,然而还缺少对这些数据的处理或者运算的能力。因此C语言提供了一系列的运算符,运算符就是用于指定对特定类型的变量与常量要进行的操作,在运算符中被操作的这样的变量或者常量叫做操作数。只有一个操作数的运算符叫单目运算符,只有2个操作数的叫双目运算符,有3个操作数的叫三目运算符。
运算符 |
结合律 |
() [] -> . |
从左到右 |
! ~ ++ -- +(正号) -(负号) *(指针取值符) (type)
sizeof & |
从右到左 |
* / % |
从左到右 |
+ - |
从左到右 |
<< >> |
从左到右 |
< <= > >= |
从左到右 |
== != |
从左到右 |
& |
从左往右 |
^ |
从左往右 |
| |
从左往右 |
&& |
从左往右 |
|| |
从左往右 |
?: |
从右往左 |
= += -= *= /= %= &= ^= |= <<= >>= |
从右往左 |
, |
从右往左 |
下面来逐一的介绍每一个C语言操作符的使用方法。注意:由于某些操作符和后面的C语言知识息息相关,比如位运算操作符,所以目前大家可能对它还比较陌生,但没有关系,等具备了更多的相关知识,再来学习,就问题不大了。
():扩号运算符
int a = 2;
int b = 1;
int c = 10;
(a+b)*c;
printf(“hello world”);
[]:数组下标运算符
int a[10] = {0};
a[0] = 10;
->:成员选择运算符(左边一般为结构体指针)
.:成员选择运算符(左边一般为结构体变量)
参考第十章,结构体中会详细介绍。
单目运算符:
!:逻辑非运算符,将真值变为假值,将假值变为真值。
int a = 10;
if (!(a==0))//if中的表达式的值为true
{
}
~:按位取反运算符
int a = 10;
~a;
参考第十二章位运算中详细介绍。
++:自增运算符
int a = 10;
a++;
int b = a++;
int c = ++a;
注意a++与++a的区别:
如果单独如下写:
a++;
++a;
没有任何区别。
但是如果是在其它场景下,比如:
int b = a++;//此时相当于:b=a;a = a+1;
int c = ++a;//此时相当于:a=a+1;c=a;
这个时候a++是先取a的值,再对a加1;++a是先对a加1,再取a的值。
--:自减运算符
int a = 10;
a--;
int b = a--;
int c = --a;
a—与—a的区别与a++与++a类似。
+:正号运算符
-:负号运算符
int a=10;
int b = -a;
*:取值运算符
&:取址运算符
参见第八章指针中会详细介绍。
(type):强制类型转换运算符
int a = 10;
float f=(float)a;
sizeof:长度运算符
int a = 10;
int length = sizeof(a);
int len = sizeof(int);
算术运算符:
*:乘法运算符
int a = 10;
a = a*10;
/:除法运算符
int a = 10;
int b = a/3;
int c = a/5;
%:取余运算符
int a = 10;
int b = a%5;
int c = a%3;
+:加法运算符
int a = 10;
int b = 20;
int c = a + b;
-:减法运算符
int a = 10;
int b = 5;
int c = a – 5;
<<:左移运算符
>>:右移运算符
参见十二章位运算会详细介绍
比较运算符:
<:小于运算符
<= :小于等于运算符
>:大于运算符
>=:大于等于运算符
==:等于运算符
!=:不等于运算符
int a = 10;
int b = 20;
if (a > b)
{
}
if (a >= b)
{
}
if (a < b)
{
}
if (a <=b )
{
}
if (a != b)
{
}
if (a==b)
{
}
在数学里类似的表达式a<b<c,在程序设计语言里不能这样写,而应该写成:
a<b &&b<c。
而在数学的等于(=)符号,在程序里必须用==。这是一个初学者经常犯下的错误,即很容易把==写成=。看下面的程序:
int a = 0;
if (a == 1)
{
}
else
{
}
由于a不等于1,所以上面的程序将执行else分支里的语句。但是,假如由于错误的把==写成了=,则变成了:
int a = 0;
if (a = 1)
{
}
else
{
}
这个时候,整个表达式的值就是a的值,而a已经被赋值为1,所以,if(a=1)为真,那么就应该执行if分支里的语句,而永远不会执行else分支的值了。
要避免这个错误的发生,一个推荐的方法是把常量写在==左边,而变量写在==的右边。这样以来,程序在编译的时候,就会被编译器捕获错误,因为一旦把==写成了=,你不可能给常量赋值。比如:
1==a
不小心写成了
1=a
编译器一看就知道错误发生了。1是常量,不可能被赋值。
&:按位与运算符
^:异或运算符
|:按位或运算符
位运算&,^,|的具体计算参见十二章位运算会详细介绍。
逻辑运算符:
&&:逻辑与运算符
||:逻辑或运算符
int a = 10;
int b = 20;
if (a>b && a>0)
{
}
if (a<b || b > 0)
{
}
&&运算符中,比如:a&&b&&c,假如计算出左边的某个值为假,那么就没有必要计算后面的表达式了。比如,假如a为真,那么继续计算b的值,如果b为真,那么就计算c的值,如果a,b,c都为真,那么整个表达式就为真。而一旦a为假,那么就不用计算b和 c了,整个表达式就为假。
||运算符中,比如:a || b ||c,假如计算出左边的某个值为真,那么就没有必要计算后面的表达式了。比如假如a为假,那么继续计算b的值,假如b 为假,那么就计算c的值,如果a,b,c都为假,那么整个表达式的值就为假。而一旦a为真,那么就不用计算b和c的值了,整个表达式就为真。
比如上面的表达式:a>b && a >0,由于a值为10,b的值为20, a大于b 为假,所以根本就不用结算a>0了,整个表达式必为假。而对于表达式a<b || b>0,由于a大于b为真,所以,根本就不用计算b>0的值,整个表达式的值就为真。
?::三元运算符
三元运算符A?B:C,在计算的时候,先计算A部分的值,如果A部分位真,就计算B部分的值作为整个表达式的值,否则计算C部分表达式的值,作为整个表达式的值。
求2个数最大值:
int a = 10;
int b = 20;
a> b?a:b;
判断一年是否为润年:
year%(year%100?400:4)?1:0
=:赋值运算符
int a = 10;
int b = a;
复合运算符:
+=
-=
*=
/=
%=
&=
^=
例子:
int a = 10;
a += 10;//等价于a
= a+10;
a *= 10;// 等价于a
= a*10;
a -= 10;// 等价于a
= a -10;
a /= 10;// 等价于a
= a / 10;
a %= 10;// 等价于a
= a %10;
a &= 10;// 等价于a
= a&10;
a ^= 10;// 等价于a
= a^10;
a |= 10;// 等价于a = a | 10;