C语言的操作符总结

C语言操作符有些什么

先给他们分个类好吧:

  1. 算术操作符:+ , -, *, /,%
  2. 移位操作符:<< 表示左移操作符,  >> 表示右移操作符
  3. 位操作符:&表示按位与(都为1才为1),|表示按位或(有一个1则为1),^表示按位异或(相同为0,不同为1)
  4. 赋值操作符:= , +=, -=, *=, /=, %=, <<=,   >>=,   &=,  ^=,  |=  
  5. 单目操作符:  (!表示逻辑非),(-表示负号),(+表示正号),(&表示取地址),(~表示对一个数的二进制按位取反)(-- 表示前置,后置--),(++表示前置,后置++),(*表示间接引用,解引用),(类型)表示强制类型转换,(sizeof()表示以字节为单位,测操作数的类型长度)
  6. 关系操作符:> ,  >=,  <,  <=,  !=,  ==
  7. 逻辑操作符:  &&   ,    ||
  8. 条件操作符:       表达式1?表达式2:表达式3      表示若表达式1为真,则返回表达式2的值,否则返回表达式3的值
  9. 逗号表达式:,
  10. 下标引用,函数调用和结构成员:[],  (),   .,   -> 

怎么用

1.算术操作符:

这应该都会用吧,不多说了,但有以下几点需要注意:

     1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

     2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。

     3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.移位操作符:

      需注意的是:不可移动复数位,因为这是标准为定义的。

      左移:左边抛弃,右边补0,二进制下进行。

      右移:根据编译器的不同,有两种移位规则:(1)逻辑移位:左边补0,右边抛弃。(2)算术移位:左边用原该值的符号位填充,右边抛弃。

应用实例:

void show_odd_even_bits(int n){
	int i = 0,j = 0;
	printf("奇数位:");
	for (i = 31; i >=0; i -= 2){
		printf("%d ", (n>>i) & 1);//int型共32位,从左边第一位开始是奇数位的头,所以循环从31开始,先将n这个数右移31位再与1,即求出这个数n换成二进制后左边的第一位数,依次类推。
	}
	printf("\n");
	printf("偶数位:");
	for (j = 30; j >= 0; j -= 2){
		printf("%d ", (n>>j) & 1);
	}	
	printf("\n");
}

这是一个将一个数的二进制(因为数在计算机内存中以二进制形式存储,所以不需要特别转换成二进制,可以直接用)的奇数位和偶数位分别打印出来的函数。 

3.位操作符

注意:他们的操作数都是整数。

应用实例1(不创建临时变量交换两个数):

#include<stdio.h>
int main(){
    int a=11,b=22;
    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;
}

应用实例2(求一个整数存储在内存中的二进制中1的个数

int NumberOf1(int n){
	int count = 0;
	while (n != 0){
		n = n&(n - 1);// 与了几次就表示这个数的二进制下中有多少个1
		count++;
	}
	return count;
}

4.单目操作符

这里只说一下sizeof和前置++,后置++这些个东西。

sizeof():  编译期间 确定类型的字节大小     并且  不会参与运算。

#include <stdio.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));//输出为4
}
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));//输出为40
 printf("%d\n", sizeof(ch));//输出为10
 test1(arr);
 test2(ch);
 printf("%d\n", sizeof(int));//输出为4,也可以写成printf("%d\n", sizeof int );
 return 0;
}

 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(){
	int a = 10;
	int b = a++;
	int c = ++a;
	a = a++;
	printf("%d\n", b);//10  先使用a赋值给b,此时b=10,a再++为11
	printf("%d\n", a);//13
	++a;
	a++;
	printf("%d\n", c);//12
	printf("%d\n", a);//15
	return 0;
}

5.关系操作符

主要用于条件判断,注意=为赋值语句,==才为条件判断。

6.逻辑操作符

1.  表达式1  &&  表达式2  &&  表达式3,计算机是这么做的:

先判断表达式1,若为假则后面的表达式都不进行计算,直接返回0;若表达式1为真,再计算表达式2,若为假则不进行计算表达式3,返回0,若为真则再计算表达式3;若表达式3为假,则返回0,为真则返回1.

2. 表达式1  ||  表达式2  ||  表达式3     计算机这么做:

先判断表达式1,若为真则不计算后面的表达式2和3,若为假,再计算表达式2,若表达式2为真,则不计算表达式3,若表达式2为假,则在计算表达式3,真则返回1,假则返回0。

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++; //若注释掉上条语句,执行这条语句,则输出为a=1,b=3,c=3,d=4
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);/a=1,b=2,c=3,d=4
    return 0;
}

7.条件操作符

举个例子:

判断两个数的大小,一种是正常的使用比较关系操作符,另一种是不使用比较关系操作符

int Max(int a,int b)
{
	return a > b ? a : b;
}
int Func(int a,int b)//不用>,<,=等关系操作符判断两个数的大小
{
	return (a-b)>>31 ? -1 : (a-b ? 1 : 0);//先判断(a-b)>>31,即判断a-b的符号为,若为1则a<b,返回-1,若为0则a>b,返回(a-b ? 1 : 0),而(a-b ? 1 : 0)表示当a-b大于0时返回1,a-b为假时(即a=b的情况)返回0
	                      
}

8.逗号表达式

int a=(表达式1,表达式2,表达式3);  //每一个表达式都要计算,但a的值等于最后一个表达式的值

9.下标引用

. 结构体.成员名

-> 结构体指针->成员名

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct A
{
	int a;
	int b;
};

struct B
{
	int c;
	struct A AA;
	struct A *pa;
};
int main()
{
	struct B stuB;
	stuB.AA.a;  //结构成员访问
	stuB.AA.b;
	stuB.pa->a; //结构成员访问
	stuB.pa->b;
	stuB.c;
	stuB.AA;
	stuB.pa;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值