Hello,我们又见面了,最近不知道大家是否在持续输出代码呢?代码能力是否提高了呢?今天让我们来一起学习操作符,操作符在我们学习语言中很重要,我们要知道每个操作符的作用和用法,下面开始我们的学习。
- 操作符分类:
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
2算数操作符
+ - * / %
加(+) 减(-) 乘(*)和数学的一样,和大家讲一讲除(/)和取模(%)的用法。
#include<stdio.h>
int main()
{
float a = 5 / 2;
printf("%f", a);
return 0;
}
我们可以看到虽然是浮点型,但是求出来的不是我们想要结果,这是为什么呢
原因是我们要求小数点的后面位的时候,5和2必须要有一个小数,比如5.0或者2.0,让我们加上看一看结果吧
#include<stdio.h>
int main()
{
float a = 5 .0/ 2;
printf("%f", a);
return 0;
}
还有我们的取模符号
首先取模符号左边和右边必须是整型,结果是余数
#include<stdio.h>
int main()
{
int a = 9 % 2;
printf("%d", a);
return 0;
}
这样写就对了
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
3. 移位操作符
在讲位移操作符的时候我们得先了解一个东西,那就是二进制,因为我们的移位操作符操作的是二进制的补码
我们的整数是可以用二进制来表示的,整数的二进制有三种表达形式,分别是
原码
反码
补码
其中正数的二进制,反码补码原码都相等,但是负数的不相等
负整数数的反码是原码符号位不变,其余按位取反,补码是反码加1
下面举几个例子来让大家更好的了解二进制
大家可能对二进制的计算不是特别明白,但是大家肯定知道十进制,十进制就是我们生活中常用的数字,满十进一位,就像9到10一样,那我们的二进制也是一样,满2就往前进一位,比如111就是十进制的7
计算结果就是我们常用的十进制
我们简单了解二级制位,那么让我们来看一看原码反码补码
正整数的原码反码补码是一样的,比如5的原码是
00000000000000000000000000000101 原码
00000000000000000000000000000101 反码
00000000000000000000000000000101 补码
而我们的位移操作符是对二进制的补码进行操作的
左移操作符<<
#include<stdio.h>
int main()
{
int a = 5<<1;
printf("%d", a);
return 0;
}
学会正整数的左移操作符,让我们来学习一下负数的吧
#include<stdio.h>
int main()
{
int a = -5 << 1;
printf("%d", a);
return 0;
}
这样解释大家一定明白了吧,所以左移的规则是右边舍弃,左边加0。
右移操作符>>
右边操作符和左移也差不多
- 逻辑移位
左边用0填充,右边丢弃 - 算术移位
左边用原该值的符号位填充,右边丢弃
下面举个例子
#include<stdio.h>
int main()
{
int a = 5 >> 1;
printf("%d", a);
return 0;
}
算数移位的右边是加符号位
补充:补码变成反码也可以先取反然后加1,符号位不变
警告:对于移位运算符,不要移动负数位,这个是标准未定义的。
int num = 10;
num>>-1;//error
4. 位操作符
& //按位与
| //按位或
^ //按位异或
首先他们操作的都是整数
- 按位与&
#include<stdio.h>
int main()
{
int a = 5 & 3;
printf("%d", a);
return 0;
}
这里的按位与我们可以这样理解,首先我们要把他们的二进制位都写出来,就像上面的一样然后对齐,有一个0的结果就是0,全部为1的才是1。
- 按位或|
#include<stdio.h>
int main()
{
int a = -1|3;
printf("%d", a);
return 0;
}
所以按位或是有一个1就是1
- 按位异或
#include<stdio.h>
int main()
{
int a = -1^3;
printf("%d", a);
return 0;
}
这样我们就位操作符讲明白了,在给大家补充一点,这些操作符都是双目操作符,什么是双目操作符呢,比如3&5,&两边的操作数分别是3和5,那么&就是双目操作符,大家看到&是不是会想到取地址符号,当然他们肯定是不同的,取地址&是个单目操作符
下面是一个笔试题,不能创建临时变量(第三个临时变量)来交换数
#include<stdio.h>
int main()
{
int a = 20;
int b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
5. 赋值操作符
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。
所以我们在给我们的变量赋值的时候一定要看起来至少能让人明白a = x = y+1
像这个代码的话先把y+1赋值给x在赋值给y,这样的可读性并没有分开赋值看起来的明白
复合赋值符
6. 单目操作符
逻辑反操作
相当于把真变成假,把假变成真比如我的if函数中if(1)就是真,但是我们如果加上!就变成if(!1)就是逻辑假
负值和正值
插入一个代码大家马上就能理解
#include<stdio.h>
int main()
{
int a = -4;
printf("%d", -a);
return 0;
}
编译器显示的答案就是4
正值就和我们的正数一样
- . 取地址&
就是取出该变量在我们内存的位置
- sizeof
#include <stdio.h>
int main()
{
int a = -10;
int *p = NULL;//定义为空指针
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);//这样写行不行?可以
printf("%d\n", sizeof int);//这样写行不行?答案是不能
return 0;
}
在X86编译器下地址的字节是4位,在64位的平台下,字节大小是8位
sizeof中最难的就是和数组组合,因为大家可能总是会有一个误解,举个例子给大家。
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
//问:
//(1)、(2)两个地方分别输出多少?
//(3)、(4)两个地方分别输出多少?
只要大家知道函数在传数组的时候传过去的首元素的地址,相信大家应该就能理解了,之前的文章也专门讲过,不会的往前看看就行了。
-
~
是按位取反,相当于把一个二进制数1的部分变成0,0的部分变成1
#include<stdio.h>
int main()
{
int a = 2;
printf("%d", ~a);
return 0;
}
- 前置++和–
先++或者–然后再使用
#include<stdio.h>
int main()
{
int a = 1;
int b = ++a;//a=a+1 b=a
printf("%d %d", a, b);
return 0;
}
#include<stdio.h>
int main()
{
int a = 1;
int b = --a;//a=a-1 b=a
printf("%d %d", a, b);
return 0;
}
后置++和–
#include<stdio.h>
int main()
{
int a = 1;
int b = a++;//b=a a=a+1
printf("%d %d", a, b);
return 0;
}
#include<stdio.h>
int main()
{
int a = 1;
int b = a--;//b=a a=a-1
printf("%d %d", a, b);
return 0;
}
解引用操作符*
一般用在指针,比如想知道指针变量的内容的时候我们就可以用*来知道他的内容,大家是不是可以发现他和&取地址刚刚好相反
()这个符号是强制转换,举个简单的例子
#include<stdio.h>
int main()
{
float a = 5.0;
int c = (int)a / 2;
printf("%d", c);
return 0;
}
虽然是浮点型,但是经过我们的强制转换,最后a是一个整型文章来源:https://www.toymoban.com/news/detail-527315.html
-
7. 关系操作符
警告:一定要区分==和=
今天的分享就到这里,期待下次和你们见面文章来源地址https://www.toymoban.com/news/detail-527315.html
到了这里,关于初阶C语言——详解操作符(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!