大一初识c语言(二)

操作符(重点)

c语言中共有9种操作符。
1.算数操作符

操作符意义
+
-
*乘(有浮点数,结果为浮点数)
/除(有浮点数结果为浮点数,若均为整数结果是只取整数部分)
%地板除(只能用于整数,取余数)

2.移位操作符

移位操作符意义
<<左移位
>>右移位

位移操作符是针对一个数的二进制
左移:二进制向左移动一位,抛弃左边最大值,右边补零。(相当于*2)
右移:分为算术右移和逻辑右移(相当于/2)
算术右移(有符号数):向右移动一位,抛弃右边最小值,左边空出来的补符号位, 即1。
逻辑右移(无符号数):向右移动一位,抛弃右边最小值,左边空出来的补0。
若移动位数超过数字占有的位数,则移动超出的位数,例如33%32=1,移动一位。

3.位操作符

位操作符意义
&按位与
|按位或
^按位异或(相同为0,相反为1)

4.赋值操作符

赋值操作符意义
=等于赋值
+=自身加赋值
-=自身减赋值

5.单目操作符

单目操作符意义
逻辑非
&取地址符
sizeof求长度(不是一个函数,所以可以写成printf(“%d”,sizeof a);)
~对一个数的二进制按位取反
++b=a++先让b=a,a再加1;b=++a先让a加1,再让b=a
--b=a++先让b=a,a再加1;b=++a先让a加1,再让b=a
*间接访问操作符

1.&是取地址符,%p是打印地址
2.a=(类型)b
适用于强制转换

int num=12;
float c;
c=(float)num;
printf("%f",c);
//输出结果是12.000000

6.关系操作符

==,>=,<=,!=,>,<

7.条件操作符
1.exp1?exp2:exp3;(类似与if条件语句)
exp1成立执行exp2,否则执行exp3;
2.exp1,exp2,exp3(逗号表达式)

int a=1,b=2;
int c=(a=a+1,b=b+a,a+b)
printf("%d",c)
//结果是最后一个表达式的结果,所以是6

8.其他操作符
[]数组操作符;
()函数操作符;
.和->是结构体成员访问操作符(可结合下面结构体知识)

9.逻辑操作符
&&逻辑与
||逻辑或

关键字(重点)

关键字是c语言自带的,所以不能用作变量名。(32个)
在这里插入图片描述
在这里插入图片描述
关键字讲解笔记:
typedef 类型重命名
例如:

typedef int zhengshu;
int main
{
	int a=10;
	zhengshu b=10;
	//其中a==b
}

static 是静态(可以用来修饰全局变量,局部变量和函数)
1.static修饰局部变量,如在一个text函数中static int num=1; 是在主程序编译时就给a分配了位于静态区的空间,所以static int num=1;只会执行一次,这也就使static修饰的局部变量不受局部作用域的限制。(作用域变大)
2.static修饰的全局变量,不可以用到同一项目下的不同文件,但对于普通变量同样外部的文件要用本文件的变量名,要用extern,因为普通变量具有外部链接属性,而static修饰过后该变量的外部链接属性就变成了内部连接属性.(作用域变小)
3.static修饰函数:类似于static修饰全局变量,不可以用于同一项目下的不同外文件,外部链接属性变成了内部连接属性.

define
1.define定义常量 ex: #define a 10;
2.define定义宏 ex:#define add(x,y) x+y;

指针(重点)

&:取地址操作符

int main()
{
	int num=10;
	printf("%p",&num);//地址的16进制,若输出数据不够8位数,则左侧补零
	printf("%p",&num);//地址的10进制
	return 0;
}

设置指针变量

int* p=&num;//其中p就是指针变量

int说明p指向的对象num是int类型,而*表示p是指针变量.
*是解引用操作符,所以*p就是指num的值,也就是10。、
指针变量的大小取决于地址的大小;
32位的小黑子的地址对应4个字节;
64位的小黑子的地址对应8个字节;

结构体(struct)

结构体是把一些单一类型组合在一起。

struct student //这是一个创建的新的学生的类型
{
	int id;
	int age;
	char name[10];
	char sex[10];
};
int main()
{
	struct student student1={1,18,"小黑子",'男'};
	return 0;
}

用结构体类型的指针变量作为函数的参数变量,并用函数来输出结构体的成员变量的方法。

//创建一个输出的函数
void print(struct student * p)
{
	//方法一
	printf("%s\n%d",(*p).name,(*p).age);
	//方法二
	printf("%s\n%d",p->name,p->age);
}

分支和循环语句

控制语句是用于操控程序的执行流程,以实现程序的各种结构方式,他们由特定的语句定义符组成,c语言有9种控制语句。分为一下三种

控制语句包含
选择判断语句(分支语句)if语句,switch语句
循环语句for语句,while语句,do while语句
转向语句break语句,continue语句,return语句,goto语句

一.分支语句
1.if语句
if(表达式)
语句1;
else if(表达式)
语句2;
else
语句3;
表达式的类型是bool值,0表示否,其他整数表示是。
else并不是与和其位置对应的if为一组,而是和其最近的为一组。
2.switch语句
switch(整形表达式)
{
case 整型常量表达式1:语句1;break;
case 整型常量表达式2:语句2;break;

default:语句3;break;
}
其中case决定了switch的入口,所以一定要加break。
switch的表达式必须是整数类型或字符类型。
case的表达式必须是整数或字符常量。
switch语句可以嵌套.
default是如果没有一个case满足则执行default,否则不执行。
如果default在case之前那么会先执行除了default的语句,之后在执行default。
二.循环语句
可用break和continue.
getchar()的变量类型是int,ex: int c = getcher();
putchar()用于输出getchar对应输入的字符,ex: putchar(a);
1.while语句
while(表达式)
{
…;
}
2.for语句
for(表达式(初始化部分);表达式(条件判断部分);表达式(调整部分))
{
…循环语句;
}
3.do…while语句
do{
循环语句;
}while(表达式);
清屏代码 system(“cls”) 其中system是一个可以执行系统操作的库.

生成随机整数 int mun=rand()

  1. 可用srand(返回时间戳time函数)进行干扰(来设置一个起点),但要引用头文件#include <time.h> ;srand((unsigned int) time (NULL)); 其中因为time的参数是一个指针变量,所以要加入一个 空指针 接就是 NULL 。
  2. 也可 int mun=rand()%100+1 代表者随机数的范围是1到100;原理就是rand() 的范围是0~32767,但他除于100取余不可能大与等于100或小于等于0,然后再加1所以结果就是1到100的范围 .

关机 system(“shutdown -s -t 60”); 就是在60秒后电脑关机
取消关机 system(“shutdown -a”);
三.转向语句
break:表示跳出本次循环,不再进行下次循环。
continue:表示跳出本次循环,并直接进行下次循环.
return:返回函数的返回值.
goto:(用处不多)在同一函数内跳到指定的行(前提要打好标签),能够打乱程序的执行顺序

#include <stdio.h>
int main()
{
	printf("ikun\n");
	goto exit;         //直接跳到exit行。也就是跳过了come on这句
	printf("come on");
exit:
	printf("where are you"); 
	return 0;
}
//输出结果是
//ikun
//where are you

函数

1.函数是子程序,是一个大的程序中的部分代码,又一个或多个语句块组成,相较于其他代码就有相对的独立性.

2.分为库函数和自定义函数

  1. 库函数(使用时要加入特定的头尾文件):常用的库函数有:
    1. IO函数
    2. 字符串操作函数
    3. 字符操作函数
    4. 内存操作函数
    5. 时间/日期函数
    6. 数学函数
    7. 其他库函数
  2. 自定义函数:程序员自己创造的函数(尽可能实现 高内聚,低耦合 的特点).
    当实参传给形参的时候,形参的值是实参的临时拷贝,所以改变形参不影响实参。(可以进行传实参地址,来改变实参)
    返回值类型 函数名(形参的定义)
    {
    函数内容;
    }

3.函数的参数
分为实参和形参.
实参:真实传给函数的是实参,可以是常量,变量,表达式,函数等。
形参:是函数名后括号中的变量,因为只在函数调用时才会给形参分配内存,所以叫形式参数,在函数结束后自动摧毁。(结合之前学习的,static的静态变量可以避免销毁)

4.传值调用和传址调用(只适用于变量)
传值调用:仅传变量的值,改变形参,不会对实参造成改变。
传址调用:传给函数地址,也就可以改变实参的值。
但是数组传参,传的是数组首元素的地址而不是数组。

5.函数的嵌套调用和链式访问
嵌套调用:一个函数中用另一个函数,但在一个函数中不能创造新函数,也就是不能嵌套定义.
链式访问:把一个函数的返回值作为另一个函数的实参

#include <stdio.h>
int main()
{
	printf("%d",printf("abcdef\n"));//printf函数的返回值是printf打印的字符串的字符个数有a,b,c,d,e,f,\n,7个字符所以这里printf返回7,之后又被printf打印.
	return 0;
}
//返回值是
//abcdef 
//7

return返回的值最终是在函数调用结束后存放在eax寄存器中,故不会占有内存,只会占CPU的寄存器,而静态变量相当于全局变量,直到程序结束才会销毁。

6.函数的声明和定义函数要先声明后使用
函数定义:就是创造一个函数
函数声明:也就是如果函数定义在主函数main之后,需要在主函数前或者主函数里面重新声明。
返回类型 函数名 (形参);
可以以.h为后缀来创造头文件(要在头文件中加 #pragma once 来防止头文件多重包含),并在头文件中声明其他文件中的函数,再在主程序先引用 #include “wenjianming.h” 就可以在主程序直接引用函数,而不用声明函数。用库的头文件用< >,自己的头文件用" "。(但同一项目下,主程序可以用直接其他文件的函数,但会警告)。
这种的方式用的不是很多,但在让别人使用你的项目时,你发送一个.h文件和一个静态库.lib,这样别人可以通过看.h文件来知道你的项目该如何使用,但是不能看到你的源代码,因为你的静态库是一个二进制的程序,别人无法看懂所以只能使用,因为二进制是加密过的,但有能力的还是可以破解的
别人在使用时要在主函数,开头用于 #pragma comment (lib,“静态库名.lib”) 来导入静态库,再==#include “wenjianming.h”==来引入头文件,再按照头文件的指示进行操作。这种方法就是可以使函数和主函数剥离开来,进行使用.

7.函数的递归(递推和回归)与迭代(非递归)(核心思想是把大事化小)
程序调用自身的编程技巧叫做函数的递归。(在程序设计语言中广泛应用)
递归的两个必要条件:
1.存在限制条件,当满足这个限制条件时,递归就不在继续。
2.每次递归之后会越来越接近这个限制条件.

#include <stdio.h>
#include <stdlib.h>
void list(unsigned int a)
{
	if(a>9)
		list(a/10);//再次调用list函数
	printf("%d ",a%10);
}
int main() 
{
	int mun=12345;
	list(mun);
	return 0;
}
//结果为1 2 3 4 5

stack overflow 是栈溢出.因为函数的调用会向栈上申请空间,如果递归没有停下来的条件,就会无限向栈申请空间,从而导致栈溢出。
解决使用递归时出现栈溢出情况:
1.可以用递归,但如果存在栈溢出和其他问题要换非递归的方法。
2.使用static对象(静态对象)代替nonstatic局部对象(栈对象)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律的麻瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值