对C中操作符的认知
来源:互联网 发布:mysql-5.5.57安装 编辑:程序博客网 时间:2024/05/22 14:26
C中操作符的介绍
<一>算数运算符 + - * / %(取余)
这里需要注意 1.对于 / 操作符,若是进行浮点数除法,应保证两个操作数中至少有一个为浮点数。
2.对于 % 操作符,两个操作数必须为整形。
<二>移位操作符 <<(左移) >>(右移)
1.左移
左移抛弃,右边补0(一个数左移1位相当于给它*2)
int a=1,b=0;b=a<<1;printf("b=%d\n",b);//2,b=a*2printf("a=%d\n",a);//1,a保持不变
2.右移
分为:(1) 算数右移(计算机中采用)
(2) 逻辑右移
算数右移:右边抛弃,左边用该数的符号位补上;
逻辑右移:右边抛弃,左边补0;
练习:编写代码,求一个整数存储在内存中的二进制序列中1的个数
//1.写一个函数返回参数二进制中 1 的个数//方法一#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int count_one_bits(int value){int c = 0;while (value){if ((value & 1) != 0){c++;}value = value >> 1;}return c;}int main(){int num = 0;scanf("%ud", &num);int count = 0;count = count_one_bits(num);printf("%d,%d", num, count);fflush(stdin);getchar();return 0;}//1.写一个函数返回参数二进制中 1 的个数//方法二#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int count_one_bits(int value){int c = 0;while (value){value = value&(value - 1);c++;}return c;}int main(){int num = 0;printf("请输入一个整数:");scanf("%ud", &num);int count = 0;count = count_one_bits(num);printf("二进制序列里1的个数为%d", count);fflush(stdin);getchar();return 0;}
警告!对于移位运算符,不要移动负数位,这个是标准为定义的
<三>位操作符 & | ^ (它们的操作数必须是整数)
有一道比较有意思的面试题:不能创建新的变量,实现两个数的交换
//2,不允许创建临时变量,交换两个数的内容#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main(){int num1 = 3, num2 = 6;printf("未交换之前:\n");printf("num1 = %d, num2 = %d\n", num1, num2);printf("交换之后:\n");num1 = num1 ^ num2;//利用位运算,保存两数的关系num2 = num2 ^ num1;//两二进制数异或:相同为‘0’,不同为‘1’num1 = num2 ^ num1;printf("num1 = %d, num2 = %d\n", num1, num2);getchar();return 0;}
还有一种方法比较简单易懂的方法:点击打开链接
<四>赋值操作符 =
int weight=120;//体重太重了,不满意?weight=90;//不满意就赋值复合赋值符 += -= *= /= %= >>= <<= &= |= ^=
更加简洁,效率没有变化
<五>单目操作符
! 逻辑取反- 负值+ 正值& 取地址sizeof 操作数的类型长度 (以字节为单位)~ 对一个数的二进制按位取反-- 前置 后置++ 前置 后置* 间接访问操作符(解引用操作符)() 强制类型转换
int a = 6;printf("%d", sizeof(a));//4 求变量的长度printf("%d", sizeof(int));//4 求类型所定义变量的长度
sizeof 和数组
#include<stdio.h>void Test_1(int arr[]){printf("%d\n", sizeof(arr));//4 数组传过去的为首地址,在内存中存放均为一个存储单元,即4个字节}void Test_2(int arr[]){printf("%d\n", sizeof(arr));//4 数组传过去的为首地址,在内存中存放均为一个存储单元,即4个字节}int main(){int arr1[5] = { 0 };char arr2[5] = { 0 };printf("%d\n", sizeof(arr1));//20 单纯数组名求整个数组的长度 5(元素个数)*4(int类型长度)printf("%d\n", sizeof(arr2));//输出5Test_1(arr1);Test_2(arr2);return 0;}
++ -- 前置:先加1或减1,再使用
++ -- 后置:先使用,再加1或减1
#include<stdio.h>int main(){int a = 4;int b = 10;printf("%d\n", a++);//输出4printf("%d\n", a);//输出5printf("%d\n", ++b);//输出11printf("%d\n", b);//输出11return 0;}
<六>关系操作符
> >=<<=!= 用于测试不相等== 用于测试相等
int a=0;if(a=5)//注意此处用的使“=”,即为赋值号,将5赋给a,值为真,即打印“haha”{
printf("haha\n");}
警告!在判断时容易将“==”错写为“=”,所以建议采用将常量写在左边;
int a=0if(5==a)//此处若写成5=a,编译器会报错{printf("haha");}
<七>逻辑操作符 && ||
需要区分 按位与 和 逻辑与,按位或 和 逻辑或
1&2---------01&&2--------11|2----------31||2---------1
注意:&& 和 II 有短路现象
求下题的结果
#include<stdio.h>int main(){int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++&&++b&&d++;
//i=a++||++b||d++;
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);return 0;}//输出为 a=1,b=2,c=3,d=4
//因为a++判断为假后表达式就不会再向后运算了//若执行下面的逻辑或运算输出结果是 a=1,b=3,c=3,d=4
< 八>条件操作符(三目运算符) exp1 ? exp2 : exp3
#include<stdio.h>//求a 和 b 中的较大值int main(){int a = 1, b = 2;int max = 0;max = a>b ? a : b;printf("%d\n",max);return 0;}
<九>逗号表达式 exp1, exp2, exp3, .......expN
逗号表达式就是用逗号隔开的多个表达式。
从左向右依次执行 ,整个表达式的结果是最后一个表达式的结果。
int a=1,b=2;int c=(a>b,a=a+b,a,b=a+1);//c是多少呢?4
<十>下标引,函数调用,结构体成员
1.[]
操作数:一个数组名,加一个索引值
2.()
函数调用操作符
接受一个或多个操作数:第一个是数组名,剩余的十传递给函数的参数
3.访问一个结构体成员
两种访问成员的形式
结构体.结构体成员结构体指针->结构体成员
#include<stdio.h>#include<string.h>struct Stu{char name[20] ;int age;char sex[5] ;double score;};void Change_s1_age(struct Stu *pa){pa->age = 20;}int main(){struct Stu s1;struct Stu *p = &s1;strcpy(s1.name, "hehe");/*Change_s1_name( s1);*/Change_s1_age(p);printf("姓名为%s\n", s1.name);printf("年龄为%d\n",p->age);return 0;}
<十一>表达式求值
表达式求值顺序一部分是由操作符的优先级和结合性决定的,同样,有道表达式在求值过程中可能转换为其他类型
1.隐含式类型转换
C中整型算术运算总是至少以缺省型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型。成为【整型提升】
int main(){char a = 3;char b = 127;char c = a + b;//在进行a+b 时,需要将a,b,转换为整形,一部妈的形式//将a+b的值放到c(char类型)降级为字符型,高位丢失c=10000010printf("%d ,%d", a + b, c);//结果为 130 -126//打印c时,又将c提升为整型(不骂的形式),高位补符号位c=11111111 11111111 11111111 10000010return 0;}
阅读全文
1 0
- 对C中操作符的认知
- 对Java中关键字的认知
- 对事务的认知
- 对线程的认知
- 对ssh操作远程主机的部分认知
- 【C语言】对指针p ,*p ,**p 的认知
- C语言中对文件的操作
- C中对SQL Server的操作
- C语言中对文件夹的操作
- C中对堆的操作函数
- C语言中对文件的操作
- C语言中对文件的操作
- C语言中对文件的操作
- C语言中对文件的操作
- ceph存储 ceph中对crush算法的认知
- 个人对IO流中字节流的粗浅认知
- 对人际关系的一种认知
- 对response对象的认知
- Gym 100825 H
- java程序制作ASCII编码表
- oracle之内连接与外链接
- 利用SD卡实现嵌入式Linux系统的自动升级
- 自作的一个Prison Break 界面
- 对C中操作符的认知
- 常用linux命令
- ⌊N/1⌋,⌊N/2⌋,...⌊N/N⌋的值的集合的分析
- 用类描述计算机中的CPU速度和硬盘的容量
- King
- 写给人类的机器学习 四、神经网络和深度学习
- 1.unity3d Astar pathfinding 第一个例子
- 使用node解析yaml文件
- springmvc 之视图解析器源码分析