文章目录
一.操作符
1.算数操作符
内容:
加号 | + |
---|---|
减号 | - |
乘 | * |
除 | / |
模(取余数) | % |
注意:与数学中的运算规则相同0不能做被除数!
重点1:%的左右两端只能放整数否则会报错。
重点2:/在进行小数的除法时,左右两端至少有一端带有小数,如3/4.0,且数据类型为float或者double,以%f或%lf进行打印。
思考:求圆的面积,π估计为3.14,输入半径r,如果光打印小数点后有效数字的部分,该怎么打印呢?
举例1:输入1,输出3.14,
举例2:输入10,输出314
答案:
#include<stdio.h>
int main()
{
//求圆的面积,π估计为3.14
float pai = 3.14f;//后缀f表明是float,否则编译器会认为是double类型
float r = 0;//
scanf("%f %f",&a,&b);
printf("%g",3.14*r*r);
return 0;
}
说明:这里用到的%g为格式化数据,也就是说只会把有效数据打印出来。
2.赋值操作符
内容:
赋值 | = |
---|---|
加赋值 | += |
减赋值 | -= |
乘赋值 | *= |
除赋值 | /= |
int main()
{
int a = 0;
a += 1;
a = a+1;//这两句的意思一样,都是将a加上1再赋给a,结果为1,不过第一句更为简便而已。
a*=1;
a=a*1;//同理
return 0;
}
注意:要区分=在计算机中与数学中的意思,在计算机中等号为==。
3.单目操作符
内容:
+ | 正值 |
---|---|
- | 负值 |
! | 逻辑反操作 |
& | 取地址 |
sizeof | 操作数的类型长度 |
– | 前置,后置 |
++ | 前置,后置 |
() | 强制类型转换 |
注意:+与-这里为符号位,不用于计算,在signed的类型中,二进制的最高位用于存储符号位。
重点1:sizeof不为函数,为操作符也为关键字,在求数据类型的长度时必须加上括号,这是语法规定。
#include<stdio.h>
int main()
{
int a = 0;
printf("%d\n",sizeof(int));//注意sizeof的括号不可省去
printf("%d\n",sizeof(a));
printf("%d\n",sizeof a);//此句代码可验证sizeof为操作符,且这三行的意思相同。
//所有打印的结果为int——数据类型的字节大小:4
return 0;
}
思考:下面代码的打印结果是?这里的sizeof的值是?
#include <stdio.h>
void test1(int arr[])//指针类型不代表指针的大小,指针的大小跟计算机的位数有关
//64位————8/x86————4(单位字节)
{
printf("%d\n", sizeof(arr));//(2)这里的arr是指针
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)这里的ch是指针
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)这里传的是整个数组的大小相当于int[10]
printf("%d\n", sizeof(ch));//(3)这里相当于char[10]
test1(arr);
test2(ch);
return 0;
}
思考:下列代码的结果?
补充,编译的四个阶段:
1.预处理(扩展各个宏与文件)
2.编译(得到汇编代码)
3.汇编(得到机器码)
4.链接(得到可执行文件)
int main()
{
char c = 1;
printf("%d\n", sizeof(c=c+1));//这里的转化在编译阶段已经被处理成1不会再进行计算
return 0;
}
思考:下面代码的打印结果是?
#include<stdio.h>
int main()
{
int a = 0;
int b = a++;//将a赋给b后再加1
printf("%d %d\n",a,b);
b = ++ a;
printf("%d %d\n",a,b);
return 0;
}
提示:前置先使用,后置后使用。
答案:第一个printf:0 1。第二个:2 2
4.关系操作符与逻辑操作符
内容:
关系操作符 | |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不相等 |
== | 相等 |
逻辑操作符 | |
&& | 逻辑与 |
ll | 逻辑或 |
说明:这里为了打出 ||,用了小写字母 l。
这里先引出一个分支语句:if ();else; —— 意思是如果if括号里的条件成立就执行 if 反之执行else的语句,先作为了解后面补充。
重点:括号里面的表达式如果为真,则其结果为非0,执行语句,如果为假,则其结果为0。!的作用将非0与0互换,真转假,假转真。
思考下列代码输入1的结果为?
#include<stdio.h>
int main()
{
int a = 0;
sacmf("%d",&a);
if(a>1)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
if(!a)//!1将真转假
{
printf("hehe\n");
}
if(a)//非0为真
{
printf("haha\n");
}
if(a==1)
{
printf("haha\n");
}
return 0;
}
拓展: 思考下面代码的运行结果
#include<stdio.h>
int main()
{
int i = 0,j=0,m=0,n=0,a=0,b=1,d=4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n d = %d\n i=%d\n", a, b, c, d, i);
a=0,b=1,d=4
j = ++a && b++ && d++
printf("a = %d\n b = %d\n d = %d\n i=%d\n", a, b, c, d, j);
a=0,b=1,d=4
m = a++||++b||d++;
printf("a = %d\n b = %d\n d = %d\n i=%d\n", a, b, c, d, m);
a=0,b=1,d=4
n = a++||--b||d--;
printf("a = %d\n b = %d\n d = %d\n i=%d\n", a, b, c, d, n);
return 0;
}
提示:&&一假就为假(遇到假的后面不执行),全真才为真,||一真就为真(遇到真的后面不执行),全假才为假。
5.条件操作符与逗号表达式
内容
条件操作符 | exp1?exp2:exp3 |
---|---|
逗号表达式 | exp1,exp2 ,exp3… |
重点1:条件操作符在比较两个数大小时,或两种情况的返回值时比较方便。
重点2:逗号表达式的结果为最后一个表达式的执行结果
思考如下代码,并试着判断打印结果。
#include<stdio.h>
int main()
{
int a =2;
int b =3;
if(a>b)
{
printf("%d\n",a);
}
else
{
printf("%d\n",b);
}
int ret = a > b?a : b;
printf("%d\n",ret);//这两种的打印结果相同,可以根据第一种的代码推出第二种代码的逻辑
int c =a,b;
printf("%d\n",c);
return 0;
}
二:关键字
1.类型重命名
英文名:typedef——全名:typedefine
顾名思义,就是重新换个名字,所谓换汤不换药,就是这个意思。
注意:这里的类型是数据类型,命名需放在主函数的上面,这是因为编译器扫描从上往下扫描,而且别忘了,这还是一条语句。
举例:
typedef signed long long sll;//这是一条语句要跟define区别开
int main()
{
signed long long a = 0;
sll b = 0;//这里就将数据类型重命名了,具有化繁为简的效果。
return 0;
}
2.static
内容:修饰静态变量和函数的关键字。
重点1:改变外部链接属性为内部链接属性
重点2:改变内存位置,将变量或函数存放位置由栈区改为静态区。
重点3:改变生命周期,不改变作用域。
概念引出:
1.电脑如何处理数据?
图解:
概念解释:1. CPU是中央处理器(Central Processing Unit)的缩写。中央处理器是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
2.寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。
2.C语言内存的位置在哪?
图解:
概念解释:
静态区(static):全局变量存储,在程序的整个生命周期都存在
栈区(stack):局部变量存储(自动,连续的内存)
堆区(heap):动态存储(非常大的内存池,非连续分配)
3.链接属性
外部链接属性:可以在不同的源文件进行使用。
如:
这里两个源文件,一个源文件命名一个全局变量,另一个函数声明一下便可使用,像这样的就称之为其有外部链接属性。
内部链接属性:只能在自己源文件内使用,则具有外部链接属性。
如图:
这里在一个源文件中定义全局变量时,前面加上static,这样就将外部链接属性改为内部链接属性,且在另一个源文件中不能使用!
4.生命周期的改变
思考:在add函数中,int a 前加static与不加static有什么区别吗?改变了什么,没改变什么?
void add()
{
int a = 0;
a++;
printf("%d",a);
}
int main()
{
int i=10;
while(i)
{
add()
i--;
}
return 0:
}
解析:有,在没加之前,变量a在栈区,出去大括号被销毁,进大括号创立, 加static后变量a被移到静态区,直到程序结束时,a才会被销毁,而没变的是作用域。
序言:希望大家,学有所成,思有所得,得有所就!如果有误,请委婉一点指出,如果觉得文章不错,请留下您的点赞与评论,小编会继续加油!