操作符**

本文详细介绍了C语言中的位操作符,包括移位操作符(左移<<和右移>>)以及位操作符(按位与&、按位或|、按位异或^)。内容涵盖位操作符的规则、应用,如计算二进制中1的个数,以及如何在不使用额外变量的情况下交换两个数。此外,还讨论了算术操作符、赋值操作符、单目操作符如sizeof,以及关系操作符、逻辑操作符、条件操作符和表达式求值的相关概念。

分类

算术操作符

移位操作符

针对二进制

<< >>

操作数只能是整数

左移规则:左边抛弃,右边补零

   

右移规则:分为两种

1.逻辑移位(左边用0填充,右边丢弃)

2.算术移位(左边用原该值符号位填充,右边丢弃

 写法

int num=10;
num << 1

位操作符

&按位与、| 按位或、^ 按位异或

操作数必须为整数

二进制数

 位操作符中 只有 ~ 是单目操作符,其他都是双目操作符

正数在内存中的原反补码相同

负数的原码得到反码(按位取反,符号位不变),反码得到补码(加1),反得到原码 (符号位不变按位取反再加1)

#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 for(i=0; i<32; i++)
 {
 if( num & (1 << i) )
 count++; 
 }
 printf("二进制中1的个数 = %d\n",count);
 r

计算二进制中1的个数

在不使用第三个变量的情况下交换a b

#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;
 a = a^b;
 printf("a = %d b = %d\n", a, b);
 return 0; }

a^0=a

a^a=0

赋值操作符

左边不能是常数

	int a = 10;
	a = a + 2;
	a += 2;

	a = a >> 1;
	a >>= 1;

	a = a & 4;
	a &= 4;

单目操作符

sizeof和数组

sizeof中的表达式不参与运算

​​#include <stdio.h>
void test1(int arr[])
{
 printf("%d\n", sizeof(arr));//(2)
}
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));//(1)
 printf("%d\n", sizeof(ch));//(3)
 test1(arr);
 test2(ch);
 return 0; }

(1)40 (2)4/8 (3)10(4)4/8

int b = ++a;//前置++,先++,后使用//a=a+1,b=a
int b = a++;//后置++,先使用,后++。//b=a,a=a+1
int b = --a;//前置--,先--,后使用 //a=a-1,b=a
int b = a--;//后置--,先使用,再-- //b=a,a=a-1

关系操作符

 逻辑操作符

 

 

 

 

条件操作符

exp1 ? exp2 : exp3 ;

逗号表达式

从左向右执行,最后一个表达式是结果

a = get_val();
count_val(a);
while (a > 0) 
{
    a = get_val();
    count_val(a);
}

如果使用逗号表达式,改写:

while (a = get_val(), count_val(a), a>0) 
{
  ;       //业务处理
}

 实参个数为4

 下标引用、函数调用和结构成员

【】操作数 一个数组名加值

 int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。
 [ ]的两个操作数是arr和9。

 

( )函数调用操作数

 #include <stdio.h>
 void test1()
 {
 printf("hehe\n");
 }
 void test2(const char *str)
 {
 printf("%s\n", str);
 }
 int main()
 {
 test1();            //实用()作为函数调用操作符。
 test2("hello bit.");//实用()作为函数调用操作符。
 return 0;
 }

访问结构成员

.   ->

struct Stu
{
	char name[20];
	int age;
	float score;
};

void print1(struct Stu ss)
{
	printf("%s %d %f\n", ss.name, ss.age, ss.score);
}

//结构体变量.成员名

void print2(struct Stu* ps)
{
	//printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score);
	  printf("%s %d %f\n", ps->name, ps->age, ps->score);
}
//结构体指针->成员名

int main()
{
	struct Stu s = {"张三", 20, 90.5f};
	strcpy(s.name, "张三丰");
	//scanf("%s", s.name);
     *(s.name)  = "张三丰"// err
    print1(s);
	print2(&s);
}

 

 

表达式求值

 整型提升

 按照数据类型的符号来提升,无符号数补0 有符号数补符号位

//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001

//无符号整形提升,高位补0

int main()
{
	char c1 = 3;
	//00000000000000000000000000000011
	//00000011 - c1
	char c2 = 127;
	//00000000000000000000000001111111
	//01111111 - c2
	

	char c3 = c1 + c2;
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010
	//10000010 - c3
	//11111111111111111111111110000010
	//11111111111111111111111110000001
	//10000000000000000000000001111110
	//-126

	printf("%d\n", c3);//
	//
	return 0;
}

 整型存在char中要截断,运算时要提升,打印时把补码换为原码,打印无符号数时默认该数就是正数不用换成原码。

  算术转换

转换排行:越往上越先转换为上面的

long double
double
float
unsigned long int
long int
unsigned int
int

强制类型转换和自动类型转换请看以下链接

http://c.biancheng.net/view/1775.html

注意:当有符号转换为无符号数时,打印的时候也要用无符号%u

Python 语言中,单星号操作符 * 和双星号操作符 ** 都是非常常见的操作符,它们可以用于不同的地方,有着不同的操作方式。在本文中,我们将详细解释这两个操作符的用法,并结合实例进行说明。 单星号操作符 * : 在Python中,单星号操作符 * 可以用于多种场景,其主要的作用是将可迭代对象拆分成单个的元素。 1.传递参数: 首先,* 可以用于将一个可迭代对象(如列表或字符串)作为函数的参数传递到另一个函数中,这种操作方式通常用于参数不固定的函数。 示例: ``` def add(*args): return sum(args) print(add(1,2,3)) # 输出6 ``` 2.拆分序列: * 还可以用于解包(或拆分)序列类型的数据结构,如列表、元组等,使其变成单个的元素。 示例: ``` num_list = [1, 2, 3, 4] print(*num_list) # 输出1 2 3 4 ``` 3.拼接多个列表: 将多个列表拼接为一个大列表时,也可以使用 * 操作符。 示例: ``` list1 = [1, 2, 3] list2 = [4, 5, 6] list3 = [7, 8, 9] new_list = [*list1, *list2, *list3] print(new_list) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9] ``` 双星号操作符 ** : 双星号操作符 ** 主要用于将字典类型的数据解包(或展开)成关键字参数,这种操作方式通常用于函数或方法的调用。 示例: ``` def add(a,b,c): return a+b+c dict1 = {'a':1,'b':2,'c':3} print(add(**dict1)) # 输出6 ``` 总结: 单星号操作符 * 和双星号操作符 ** 在Python中使用非常广泛,掌握它们的使用方式可以大大提高程序开发的效率。我们在函数或方法中经常会看到这两个操作符,只要学会它们的使用方法,就可以轻松地处理函数的参数和返回值,同时也可以方便地操作数据结构中的元素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值