运算符

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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容