对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;}








原创粉丝点击