C语言操作符

    选择打赏方式

操作符

算数操作符

 + - * / % 

移位操作符

<<左移位,>>右移位

右移操作符

>>,16进制数转换为2进制

  1. 算数移位
    丢弃右边一位,左边加上算数操作符,正数为0,负数为1
  2. 逻辑移位
    丢弃右边一位,左边加上0
  • 右移相当于/2

左移操作符

<<
规则较为简单,直接拿起来丢弃左边一位,右边加上0.

  • 左移相当于*2

位操作符

 按位与:&,//按二进制位进行与,00=0,01=0,11=1
    按位或:|,//按二进制位进行或,00=0,01=1,11=1
    按为异或:^,//按二进制进行异或,00=0,11=0,10=1,01=1 

题目

不使用中间变量实现两个数的交换

//第一种
# include<stdio.h>
int main()
{
        int a = 3;
        int b = 5;
        printf("%d%d\n",a,b);
        a = a+b;
        b = a-b;
        a = a-b;
        printf("%d%d\n",a,b);
        return 0;
        //缺点,可能会溢出
} 
//第二种
# include<stdio.h>
int main()
{
        int a = 3;
        int b = 5;
        printf("%d%d\n",a,b);
        a = a^b;
        //a:011
        //b:101
        //a=110
        b = a^b;
        //a:110
        //b:101
        //b=011
        a = a^b;
        //a:110
        //b:011
        //a=101
        //通过异或的操作方法可以交换两个数,不会溢出
        printf("%d%d\n",a,b);
        return 0; 

原码,反码,补码

//-1的各种码,二进制
10000000000000000000000000000001//源码
11111111111111111111111111111110//反码:源码符号位不变,其他位按位取反
11111111111111111111111111111111//补码:反码加1 

赋值操作符

 =
    weight = 10;
    a = x = 10;//连续赋值 

复合赋值

 a = a+2;
    a+=2; 

单目操作符

只有一个操作数的符号:!(逻辑反操作符),-(负数),+(正数),&(取地址操作符),sizeof(计算所占空间的大小单位是字节)既可以用值来计算,也可以用类型来计算。但是值可以去括号,类型不可以。

按位取反~

二进制位取反

++,--

前置++:++a,先++后使用,后置++:a++,先使用后++

*间接访问操作符

(类型)

强制类型转换

sizeof和数组

关系操作符

逻辑操作符

&&:逻辑于,||逻辑或

三目操作符

exp?erx1:exp2;

逗号表达式

以,隔开的一串表达式(从左往右依次计算)

下标引用操作符

函数调用操作符

调用函数时的()就是函数的调用操作符,操作数为函数名和参数

特殊操作符:.,struct:结构体,->指向对象

# include<stdio.h>
struct stu
{
        char name[20];
        int age;
        char id[20];
};
int main()
{
        int a = 10;
        //使用stu创建了一个学生对象名叫s1,并初始化
        struct stu s1 ={"站的高",20,"2020255522"};
        struct stu* ps=&s1;
        printf("%d\n",(*ps).age);
        printf("%d\n",ps->age);
        printf("%s\n",s1.name);
        printf("%d\n",s1.age); 
        return 0;
} 

表达式求值

整形提升

K&R C中定义整型提升:

  1. 只要一个表达式中用到了整型值,那么类型为char、short int活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
  2. 中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。
    这段话理解起来是不是有点困难,我们来举个例子理解起来就简单了
 char a = '2';
    char b = '4';
    char c = a + b;
    printf("%c\n",c); 

在上述过程中,尽管两个运算符”+”和”=”的操作数全为char型,但在中间计算过程中存在着整数提升:对于表达式a+b ,a、b都是char型,因此被提升至int型后,执行“+”运算,计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换。
是不是觉得很不可思议。
其实可以通过一种方式来验证它:
printf(“%d”, sizeof(a + b));
大家猜猜输出的值是多少?1,对吗?很遗憾,不是1,大小是4
这是为什么呢,显然a+b进行了整型提升,而没有来得及将int型的值赋值给c(char型),所以大小就成了4。
ANSI C规定,编译器如果能保证保证运算结果一致,也可以省略类型提升的操作——这通常出现在表达式中存在常量操作数的时候。

算数转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。

 printf("%u\n", sizeof(long double));//打印8
    printf("%u\n", sizeof(double));//8
    printf("%u\n", sizeof(float));//4
    printf("%u\n", sizeof(unsigned long int));//4
    printf("%u\n", sizeof(long int));//4
    printf("%u\n", sizeof(unsigned int));//4
    printf("%u\n", sizeof(int));//4 

操作符的属性

  1. 优先级
  2. 结合性
  3. 是否控制求值顺序
    基本语法
版权声明:若无特殊注明,本文为《若离风》原创,转载请保留文章出处。
本文链接:https://www.rlfit.cn/post-30.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框
可使用QQ号实时获取昵称+头像

私密评论

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!