0 运算符优先级
1 算术运算符:
- 2级运算符:++ 、--
- 3级运算符:* 、 / 、 %
- 4级运算符:+ 、-
2 关系运算符
- 6级运算符:> 、>= 、< 、<=
- 7级运算符:== 、!=
3 逻辑运算符
- 2级运算符:!
- 11级运算符:&&
- 12级运算符:||
参见:位操作
4 位运算符
- 2级运算符:~
- 5级运算符:>> 、<<
- 8级运算符:&
- 9级运算符:^
- 10级运算符:|
参见:位操作
5 特殊运算符
5.1 赋值运算符
x=y的含义是:将变量y的内容赋给变量x的地址所对应的那块内存。
注意:
赋值运算符的左值必须可写
不能对常量赋值:100=i;
不能对只读变量赋值:const int i; i=200;
不能对数组整体赋值:int a[3]; a={1, 2, 3};
赋值表达式:
将赋值表达式作为条件会警告,其值非零:
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
if(a=1)
#include<stdio.h>
int main(void)
{
int a;
if(a=1)
{
printf("a = %d\n", a);
}
return 0;
}
//输出:
a = 1
连续赋值:
赋值顺序从右至左
#include<stdio.h>
int main(void)
{
int a;
char b;
a = b = 128;
printf("a = %d\n", a); //-128
printf("b = %d\n", b); //-128
printf("------------------\n");
b = a = 128;
printf("a = %d\n", a); //128
printf("b = %d\n", b); //-128
return 0;
}
//输出
a = -128
b = -128
------------------
a = 128
b = -128
5.2 复合赋值运算符
复合算术运算符:(5个)
- +=
- -=
- *=
- /=
- %=
复合位运算符:(5个)
- >>=
- <<=
- &=
- |=
- ^=
注意:
- 没有 "~="复合运算符
- a *= b+c 等价于 a = a(b+c)
5.3 条件运算符(三目运算符)
计算最大值:
x = (a>b) ? a : b;
注意:
条件运算符可以单独作为一条语句,如:(a>b) ? a : b;为非法,但是以下代码合法:
int a = 2,b = 4;
(a>b) ? puts("a") : puts("b");
5.4 sizeof运算符
计算类型或者变量所占的字节数。
操作数可以是类型,也可以是变量。类型一定要加括号,而变量则可以省略。
计算字符串时,包括结束标记 '\0'
5.5 逗号运算符
参见:逗号运算符
6 复合情况
实例1:
一般代码中不要这么写,gcc编译器开启-Wall会有告警:
warning: operation on ‘a’ may be undefined [-Wsequence-point]
a += (a++);
这种一般只出现在面试题中,记录一下:
#include<stdio.h>
int main(void)
{
int a=1, b=1;
a += (a++); //等价于 a = a + (a++)=
printf("a = %d\n", a);
b += (++b); //等价于 b = b + (++b)
printf("b = %d\n", b);
return 0;
}
//输出
a = 3
b = 4
实例2:
在gcc中这两个表达式均不能通过编译,a++或++a均不能作为左值。
(a++) += a;
(++a) += (a++);
参考博客:https://blog.csdn.net/mkr67n/article/details/103912795
以上博客提到,在c++中:
int a=0,k=1;
++a=k;//正确,因为它使a的值+1,运算结果依然是变量a,所以++a是左值表达式
//a最后的值为k的值+1
int a=0,k=1;
a++=k; //错误,因为a++的运算结果是一个临时变量,
//而这个临时变量并不是你程序中定义的可寻址变量的引用,不能被更改,不能作为左值表达式
//a赋值错误
int a=0,k=1;
(a=k)=3;//正确,先执行(a=k),这个赋值表达式的运算结果依然是变量a,数值上等于k的值,因此可以作为左值表达式
//a最后的值为3
实例3:
自增与解引用,++的优先级大于,但是由于是后缀,先解引用;y==0时退出,此时y还要再+1。
int fun(char*x)
{
char*y=x;
while(*y++);
return y-x-1;
}