南京网站设公司,设计装修app,深圳大簇激光公司网站,做网站如何网站考虑优化前言
今天小羊又来为铁汁们更新C语言初阶的操作符详解#xff0c;我们在平时写代码时总会写到一些算术操作符和赋值操作符#xff0c;可是当铁汁们遇到其他的操作符时#xff0c;就会望而却步#xff0c;甚至写出一些bug#xff0c;所以这期我给铁汁们带来新鲜出炉的操作…前言
今天小羊又来为铁汁们更新C语言初阶的操作符详解我们在平时写代码时总会写到一些算术操作符和赋值操作符可是当铁汁们遇到其他的操作符时就会望而却步甚至写出一些bug所以这期我给铁汁们带来新鲜出炉的操作符详解~ 操作符分类
算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员 算术操作符
算术操作符是最常见的
-*/%
注意
除%操作符之外其他的算术操作符都可以作用于整数和浮点数使用/操作符时如果两个操作符都为整数则执行整数除法结果为整数。若其中有一个为浮点数则执行浮点数除法结果为浮点数。%操作符的两个操作数必须为整数
分析示例1
#includestdio.h
int main()
{int a 4, b 0;int c a / b;printf(%d, c);return 0;
}分析/操作符的除数不能为0否则编译器会报错就跟数学中分数中的分母不能0是一个道理。
分析示例2
#includestdio.h
int main()
{int a 8, b 3;int c a / b;int d a % b;printf(c%d\n, c);printf(d%d\n, d);return 0;
}分析C语言中的/操作符结果只保留整数部分(8/32……3)而%操作符是保留余数部分。 移位操作符
(左移操作符)(右移操作符)
注移位操作符的操作数只能是整数 移位操作符的作用是什么呢这里的“位”是指二进制位故移位操作符是指移动一个数的二进制位。并且我们得清楚一个概念整数在内存中存储的是二进制的补码所以移动的是这个数的补码的二进制位。 二进制的三种形式:
原码二进制展开反码原码的符号位不变其他位按位取反最高位是符号位正数的符号位为0负数的符号位为1补码反码加1
注正整数的原码、反码、补码相同
左移操作符
定义即操作数的二进制位向左移动 移位规则 左边抛弃、右边补0
图法示例 总结左移有翻倍的效果左移一位的结果是原来的两倍左移两位是原来的四倍。 注num左移后num本身的值并没有改变因为移位操作符并不具有重新赋值的功能若是移位之后再赋值给自己num的值才会发生改变。
右移操作符
定义即操作数的二进制位向右移动 移位规则
逻辑移位 左边用0填充右边丢弃算术移位 左边用原该值的符号位填充右边丢弃
图法示例 总结右移一位会减少到原来的二分之一右移两位会减少到原来的四分之一。 注
对于移位运算符不能移动负数位这个是标准未定义的。无论左移还是右移移动的位数不要太多比如总共32位若是移动33位无法得知 位操作符
(按位与)丨(按位或)^(按位异或)左右操作数都为真才为真否则都为假只要一边为真则为真相同为假相异为真
注在二进制中1为真0为假他们的操作数必须是整数使用对象为内存中二进制的补码
用法示例
#include stdio.h
int main()
{int x 66, y 34;int a x y;int b x | y;int c x ^ y;printf(a%d\nb%d\nc%d, a, b, c);return 0;
}运行结果
小试牛刀
不能创建临时变量第三个变量实现两个数的交换。
#include stdio.h
int main()
{int a 10;int b 20;printf(交换前a %d b %d\n, a, b);a a ^ b;b a ^ b;a a ^ b;printf(交换后a %d b %d\n, a, b);return 0;
}这里采用的思想就是0 ^ a a、a ^ a 0 a a ^ b ,将a带入b a ^ b中就得到了b a ^ b ^ ba,将b带入a a^b中就得到了aa ^ a ^ b b,因此就可以将两个数实现交换。 赋值操作符
赋值操作符是最最常用的操作符它可以让你得到你想得到的任意的值。
int a10;
double b9.0;
char ca;
a 4;
b9.7;
ct;复合赋值符
a ba - ba * ba / ba % ba ba ba ba丨 ba ^ baabaa-baa*baa/baa%baabaabaabaa丨baa^b 单目操作符
!-sizeof~- -*(类型)逻辑反操作负值正值取地址操作数的类型长度(以字节为单位)对一个数的二进制按位取反前置、后置–前置、后置间接访问操作符(解引用操作符)强制类型转换!01,!10略略取出变量地址↓下文详解对一个数二进制按位取反~101011010100↓下文详解↓下文详解见指针章详解↓下文详解
(类型)强制类型转换
int n10;
float m2.0f;
m(float)n;sizeof和数组
sizrof()是一个操作符用于计算操作数占空间大小单位是字节。 可以以类型、指针和函数等作为参数。
分析示例
#includestdio.h
void test1(int arr1[])
{printf(\n%d\n, sizeof(arr1));
}
void test2(char arr2[])
{printf(%d\n, sizeof(arr2));
}
void test3(float arr3[])
{printf(%d\n, sizeof(arr3));
}
void test4(double arr4[])
{printf(%d\n, sizeof(arr4));
}
int main()
{int a 0;float b 0.0f;double c 0.00f;long long d 12345;int arr1[10] { 0 };char arr2[10] { 0 };float arr3[10] { 0 };double arr4[10] { 0 };//计算变量大小printf(%d\n, sizeof(a));printf(%d\n, sizeof(b));printf(%d\n, sizeof(c));printf(%d\n, sizeof(d));//计算类型大小printf(\n%d\n, sizeof(int));printf(%d\n, sizeof(float));printf(%d\n, sizeof(double));printf(%d\n, sizeof(long long));//计算数组大小printf(\n%d\n, sizeof(arr1));printf(%d\n, sizeof(arr2));printf(%d\n, sizeof(arr3));printf(%d\n, sizeof(arr4));//计算地址大小test1(arr1);test2(arr2);test3(arr3);test4(arr4);return 0;
}分析
在数组传参时传递的是数组的首地址从而计算的是地址的大小计算地址大小有两种结果在32位机器上是4字节在64位机器上是8字节
前置与后置
前置操作数先自增1后再被使用先再使用 后置操作数先被使用后再自增1先使用再
#include stdio.h
int main()
{int a 5, c 0;//前置c a;//先a自增1使得a的值变为6,然后再被赋值到c.printf(%d\n, c);//6printf(%d\n, a);//6//后置a 5, c 0;c a;//先使a被赋值到c,此时a5,赋值完成后,a再自增1,变为6.printf(%d\n, c);//5printf(%d\n, a);//6return 0;
}前置- -与后置- -效果相同 关系操作符
!用于测试”不相等“用于测试“相等
关系操作符的返回结果只有真或假 常见错误 在实际编程中关系运算符 不能和搞混导致错误 逻辑操作符
丨丨逻辑与 并且逻辑或或者)
用法示例
#include stdio.h
int main()
{int i 0, m 0, a 0, b 2, c 3, d 4;i a b d;printf(a %d\nb %d\nc %d\nd %d\n, a, b, c, d);m a||b||d;printf(\na %d\nb %d\nc %d\nd %d\n, a, b, c, d);return 0;
}分析 和||有一个重要的特点当第一个表达式已经能确定整条语句的结果时后面剩余的表达式将不会执行。 上例中
a b d咱们先看a先使用a再而a为00为假所以无论后面的表达式是真是假语句的整体结果都为假。所以执行完a后b和d不再执行。”假“”任意“为”假“a||b||d咱们先看a先使用a再a1后自增1a22为真所以后面b和d也不用再执行。”真“||”任意“为”真“ 条件操作符
exp1 ? exp2 : exp3 ;
执行逻辑 当表达式1的结果为真则执行表达式2否则就执行表达式3
用法示例
当我们比较两个数的大小时通常会想到使用if语句来解决
#include stdio.h
int main()
{int a 0, b 0;scanf(%d%d, a, b);if (a b){printf(Max is %d, a);}else printf(Max is %d, b);return 0;
}而现在我们可以转换为更为简单的写法
#include stdio.h
int main()
{int a 0, b 0,c 0;scanf(%d%d, a, b);c a b ? a : b;printf(Max is %d, c);return 0;
}逗号表达式
exp1 , exp2 , exp3,…
逗号表达式就是用逗号隔开的多个表达式 运算规则 从左向右依次执行整个表达式的结果是最后一个表达式的结果。
用法示例
#include stdio.h
int main()
{int m 0, a 1, b 2, c 3, d 5;m (a, b 2, c *2, c d);printf(m%d\n, m);printf(a%d,b%d,c%d,d%d, a, b, c, d);return 0;
}逗号表达式运用的场景不是很多但是能灵活运用也有很多妙处。 下标引用、函数调用和结构成员
下标引用操作符
使用方法数组名[操作数] 具体见C语言之数组
函数调用操作符
接受一个或者多个操作数第一个操作数是函数名剩余的操作数就是传递给函数的参数。 使用方法 函数名(参数1参数2......)
int sum(int x,int y);
void test1(const char* str);结构体成员访问操作符
.结构体 .成员名 -结构体指针-成员名
#includestdio.h
struct Stu
{char name[10];char sex[5];int age;double stature;
};
#include stdio.h
int main()
{struct Stu s1 { jonny,男,19,1.79 };printf(姓名:%s\n, s1.name);struct Stu* s s1;printf(性别:%s\n, s-sex);s-stature 1.88;printf(身高:%.3lf, s-stature);return 0;
}好勒今天小羊这期C语言初阶的操作符详解大致讲解完毕剩余一小部分会在后面的文章中见~