C语言操作符详解

本文详细介绍了C语言中的各种运算符,包括算数、移位、位、赋值、单目、关系、逻辑、条件、逗号、下标引用、函数调用、结构体成员以及隐式类型转化。通过实例演示了如何使用这些运算符,特别是如何不使用额外变量交换两个整数的值。此外,还提到了整型提升的概念以及在不同类型转换中的应用。
摘要由CSDN通过智能技术生成

目录

1.算数操作符

2.移位操作符

3.位操作符

例题:交换俩个int变量的值,不能使用第三个变量,即a=3,b=5,交换之后a=5,b=3

4.赋值操作符

5.单目操作符

6.关系操作符

7.逻辑操作符

8.条件操作符

9.逗号操作符

实例: 用逗号表达式写可以避免冗余。

10.下标引用,函数调用和结构体成员

11.隐式类型转化

(1)整型提升 


1.算数操作符

+        -       *        /        %


2.移位操作符

其中可能需要原码反码补码的知识请前往学习。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


//移位操作符有    <<  >>

int main()
{
	int a = 2;
	//把a的二进制位向左移动一位
	//2(00000000 00000000 00000000 00000010)
	//左移后2<<1(00000000 00000000 00000000 00000100)
	int b = a << 1;
	printf("%d\n",b);
	
	
	int c = 10;
	//把a的二进制位向左移动一位
	//10(00000000 00000000 00000000 00001010)
	//右移后10>>1(00000000 00000000 00000000 00000101)
	b = c >> 1;
	printf("%d\n", b);

	int d = -1;
	//把a的二进制位向左移动一位
	//-1(10000000 00000000 00000000 00000001)
	//左移后-1>>1(10000000 00000000 00000000 00000001)要用到原码反码补码的知识
	b = d >> 1;
	printf("%d\n", b);
}

3.位操作符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//位操作符 &按位与 |按位或 ^按位异或

int main()
{

	int a = 1;
	int b = 5;
	// &---按位(二进制位)与
	int c = a & b;
	//a(00000000 00000000 00000000 00000001)
	//b(00000000 00000000 00000000 00000101)
	//c(00000000 00000000 00000000 00000001)
	printf("%d\n",c);

	a = 3;
	b = 5;
	// |---按位(二进制位)或
	c = a | b;
	//a(00000000 00000000 00000000 00000011)
	//b(00000000 00000000 00000000 00000101)
	//c(00000000 00000000 00000000 00000111)
	printf("%d\n", c);

	a = 3;
	b = 5;
	// ^---按位(二进制位)异或 规则:相同为0,相异为1
	c = a ^ b;
	//a(00000000 00000000 00000000 00000011)
	//b(00000000 00000000 00000000 00000101)
	//c(00000000 00000000 00000000 00000110)
	printf("%d\n", c);

    return;
}

例题:交换俩个int变量的值,不能使用第三个变量,即a=3,b=5,交换之后a=5,b=3

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int a = 3;
	int b = 5;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;

    //b^b=0;
    //b^0=b;

	printf("%d  %d",a,b);
	return;

}

4.赋值操作符

+=      -=     *=     /=      %=    >>=    <<=     &=    |=     ^=


5.单目操作符

!    -    +    sizeof   ~     --    ++   &(取地址)   *(间接访问操作符)     (类型)强制类型转化   注:只有一个操作数

对于“~”操作符有单独的介绍。操作符“~”与原码反码补码的详解

这里只介绍&(取地址)   *(间接访问操作符)     (类型)强制类型转化  操作符。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int a = 3;
	
	printf("%p\n",&a);
	//&取地址操作符(当他只有一个操作数时,他表示取地址操作符,有俩个操作数,表示按位与操作符)

	int * pa = &a;//pa是用来存放地址的,pa就是一个指针变量(注:这里的*表示告诉我们pa是指针变量)
	*pa = 20; //*解引用操作符  - 间接访问操作符(注:这里的*是解引用---操作符)
    //*pa用大白话来说就是,pa里存的是地址,解地址的意思就是通过pa的地址找到这个地址里存的东西
	printf("%d",a);

	int b =(int)3.14;//强制类型转化将浮点型3.14强制转换为int型
	printf("%d", b);
	return;

}

6.关系操作符

>       <      >=     <=      ==     !=

只需注意比较字符串不能使用“==” 


7.逻辑操作符

&&(逻辑与)        ||(逻辑或)

做题理解一下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a=%d\tb=%d\tc=%d\td=%d\n",a,b,c,d);

	i = 0, a = 1, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a=%d\tb=%d\tc=%d\td=%d\n", a, b, c, d);

	i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ || ++b || d++;
	printf("a=%d\tb=%d\tc=%d\td=%d\t", a, b, c, d);
	
	return;
}

8.条件操作符

条件操作符也叫三目操作符

表达式1?表达式2:表达式3   表达式1为真输出表达式2,表达式1位假输出表达式3

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int a = 3;
	int b = 5;
	int max=(a >b ? a : b);//如果a>5为真把1赋值给b,如果a>5为假吧-1赋值给b
	printf("%d",b);
	return;
}

9.逗号操作符

用逗号隔开的多个表达式

注:逗号表达式 - 要从左向右依次计算,整个表达式的结果是逗号表达式中最后一个表达式的结果,但是最后一个表达式的结果可能受前面表达式的影响

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int a ;
	int b ;
	int c ;
	int d ;

	int e = (a=2,b=3,c=a+4,d=c+5);
	//逗号表达式 - 要从左向右依次计算,但是整个表达式的结果是逗号表达式中最后一个表达式的结果
	
	printf("c=%d\te=%d\t",c,e);
	return;
}

实例: 用逗号表达式写可以避免冗余。

//常规代码
	a = get_val();
	count_val(a);
	while (a > 0)
	{
		a = get_val();
		count_val(a);
	}
	//用逗号表达式写
	while (a=get_val(),count_val(a),a>0)
	{

	}

10.下标引用,函数调用和结构体成员

下标引用与函数调用,对于一维数组和二维数组的详细讲解与实例

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//函数的定义
int Add(int x, int y)
{
	return x + y;
}


int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};//这里的[]是指定数组大小的语法格式,不是操作符
	printf("arr[2]=%d\n",arr[2]);
	// []下标引用操作符
	// []的操作数有俩个:(数组名)arr和(索引值)2

	int a=3;
	int b=2;
	int ret=Add(a, b);
	//   ()--函数调用操作符
	//   ()操作数是3:函数名Add和参数a,b   如果没有参数操作数就是1:函数名
	printf("ret=%d\n",ret);

	return;
}

结构体成员

对于结构体成员的操作符有俩种

结构体.成员名

结构体指针->成员名

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

struct Book //用struct可以定义一个新的结构体
{
	//结构体成员(变量)
	char name[20];
	char ID[20];
	int price;
};

int main()
{
	struct Book b = { "C语言","1119","55" };
    printf("书名:%s\n", b.name);
	//这里b是结构体变量
	//访问一个结构成员格式:结构体.成员名
	printf("书号:%s\n", b.ID);
	printf("单价:%d\n", b.price);
	

	struct Book c = { "数据结构","1214","60" };
	struct Book * pb = &c;//存储的c的地址
	
	printf("书名:%s\n", (*pb).name);//对pb进行解引用即*pb=c
	printf("书号:%s\n", (*pb).ID);
	printf("单价:%d\n", (*pb).price);
	
	//结构体指针->成员名
	printf("书名:%s\n", pb->name);//对pb进行解引用即*pb=c
	printf("书号:%s\n", pb->ID);
	printf("单价:%d\n", pb->price);

	return;
}

11.隐式类型转化

(1)整型提升 

如果对原码反码补码不了解,请先学习原码反码补码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	char a = 3;
	//3 - 00000000 00000000 00000000 00000011
	//a - 00000011

	char b = 127;
	//127 - 00000000 00000000 00000000 01111111
	//b - 01111111
	
	char c = a + b;
	//a+b时需要整型提升(有符号的类型,整型提升时高位补的是符号位。无符号类型,补0)
	//a - 00000000 00000000 00000000 00000011
	//b - 00000000 00000000 00000000 01111111
	//c - 00000000 00000000 00000000 10000010
	//char c - 10000010

	printf("%d",c);
	//因为要输出的是整型而c是char类型又需要整型提升
	//11111111 11111111 11111111 10000010 - 补码
	//11111111 11111111 11111111 10000001 - 反码
	//10000000 00000000 00000000 01111110 - 原码
	//所以%d输出的是-126
	
	return;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值