首页 > 其他分享 >c语言—操作符篇—笔记

c语言—操作符篇—笔记

时间:2022-10-20 18:32:29浏览次数:66  
标签:10 return 语言 int 笔记 ++ 操作符 printf

这章有很多要记得东西,比如操作符属性表(未附),真的需要记忆。

操作符

1.分类

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

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

2.算术操作符

+ - * / %


3.移位操作符

<< 左移操作符
(左边抛弃、右边补0)

>> 右移操作符
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
int num = 10;
num>>-1;//error

4.位操作符

& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}
//不能创建临时变量(第三个变量),实现两个数的交换。
#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;
}
//编写代码实现:求一个整数存储在内存中的二进制中1的个数。
参考代码:
//方法1
#include <stdio.h>
int main()
{
int num = 10;
int count= 0;//计数
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
//思考这样的实现方式有没有问题?

//方法2:
#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);
return 0;
}
//思考还能不能更加优化,这里必须循环32次的。

//方法3:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
//这种方式是不是很好?达到了优化的效果,但是难以想到。

5.赋值操作符

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x;
这样的写法是不是更加清晰爽朗而且易于调试。
//这些运算符都可以写成复合的效果。
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。

6.单目操作符

! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
#include <stdio.h>
int main()
{
int a = -10;
int *p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);//这样写行不行?
printf("%d\n", sizeof int);//这样写行不行?
return 0;
}
#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)、(2)两个地方分别输出多少?
(3)、(4)两个地方分别输出多少?
//++和--运算符
//前置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;
//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
int y = --a;
//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
return 0;
}
//后置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++;
//先对a先使用,再增加,这样x的值是10;之后a变成11;
int y = a--;
//先对a先使用,再自减,这样y的值是11;之后a变成10;
return 0;
}

7.关系操作符

>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”

8.逻辑操作符

&& 逻辑与
|| 逻辑或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
#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\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//程序输出的结果是什么?

9.条件操作符

exp1 ? exp2 : exp3
1.
if (a > 5)
b = 3;
else
b = -3;
转换成条件表达式,是什么样?
2.使用条件表达式实现找两个数中较大值。

10.逗号操作符

//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?
//代码2
if (a =b + 1, c=a / 2, d > 0)
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
//业务处理
a = get_val();
count_val(a);
}
如果使用逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
//业务处理
}

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

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;
}
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct Stu stu)
{
stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//结构成员访问
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0;
}
//实例1
char a,b,c;
...
a = b + c;

12.表达式求值

//实例1
char a,b,c;
...
a = b + c;
//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0
//实例1
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
//实例2
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
//算术转换
long double
double
float
unsigned long int
long int
unsigned int
int


标签:10,return,语言,int,笔记,++,操作符,printf
From: https://blog.51cto.com/u_15831330/5780423

相关文章

  • 计算机基础与程序设计 2022-2023-1 熟悉编程语言
    从以上的内容中我们看到理想让我们确定了未来的目标,为人生的价值追求提供着自觉的目标和典范。理想好比是人的生活形象的“底片”:对过去和现在,它是人生事业现实的“曝光......
  • layabox文档阅读笔记
    官方技术文档LayaAir引擎快速上手指南【新手必读】体验全部的LayaAir示例......
  • 迷迷糊糊学习笔记
    poweshell是最稳定的一个工具点击文件名,certuil.exe是作为证书服务的一部分安装的命令行程序,我们可以使用此工具在,目标计算机中执行恶意的exe文件以获得meterpreter会话......
  • 【C语言】野指针
    ......
  • 【Kubernetes】K8s笔记(十):Service 解决服务发现的关键问题
    目录0.打造Service对象的动机1.Service的工作原理2.使用YAML描述Service3.在Kubernetes中使用Service4.以域名方式使用Service5.让Service对外暴露服务......
  • 【自然语言处理(NLP)】聊天机器人模块实现
    【自然语言处理(NLP)】聊天机器人模块实现作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源......
  • 【C语言】以三子棋为例来写一个多子棋小游戏吧
    一.我们写一个游戏小程序,希望吧能够再玩过一局之后,可以选择继续游戏或者退出,所以我们先写一个循环让程序可以持续的运行起来。在这里我们选择dowhile循环,它与while循环相比......
  • 【自然语言处理(NLP)】聊天机器人系统评测
    【自然语言处理(NLP)】聊天机器人系统评测作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源......
  • 前端笔记-html-引用-20221020
    HTML引用1.<q>标签:用于短的引用。浏览器通常会为<q>元素包围引号。<p>WWF的<q>目标是构建人与自然和谐共处的世界</q></p> 2.<blockquote>标签:长引用。浏览器......
  • 形式语言
    形式语言形式语言是真实语言(程序设计语言、自然语言等)的一种数学模型。形式语言认为:语言是符号串的集合。形式语言定义:字母表上的符号,按一定的规则组成的所有符号串之......