类型与变量
概念
类型是定义变量的,什么是类型,例如张三是一个人,张三就是变量而人就是类型,什么是变量就是用来存储数据的,为什么变量会分为很多类型,因为存储的数据类型不同,需要不同的类型来定义变量好让计算机识别。
代码带入
#include <stdio.h>
int main() {
//人 张三
int a;
return 0;
}
在上面的代码中int就是类型,a就是变量。
常用的数据类型

ASCII码表

输入输出函数
输出函数

实际代码展示
printf用法
#include <stdio.h>
int main() {
//用int类型 定义 n1, n2两个变量
int n1, n2;
//返回值不懂没关系,下面这句代码的意思就是n1 接收了printf这个函数的返回值
//n1 接收返回值,printf打印hello world\n, '\n'是一个字符,在ASCII码表上有,而计算机识别到打印出来就是换行
n1 = printf("hello world\n");
//打印换行符的ASCII码值
printf("%d\n", '\n');
int a = 123;
//%d是占位符,就是为变量a占用一个位置,来打印变量a里存储的值
//不同类型的变量,占位符是不同的
n2 = printf("hello world : %d\n", a);
//打印上面两个用printf打印后的返回值n1, n2的大小
printf("n1 = %d, n2 = %d\n", n1, n2);
return 0;
}
结果显示

sprintf用法
#include <stdio.h>
int main() {
//定义一个char类型的数组,大小为可以存值100个字符,而 = {0}是什么意思,初始化这个数组;
//为什么要初始化,因为创建数组他是从内存中选取一段连续未使用的内存,而选中的内存可能会有残余的垃圾,所以需要初始话一下
//可以尝试一下不初始化,直接输出这个数据会是怎么样
char str[100] = {0};
//输出字符数组可以用%s这个占位符
printf("str = %s\n", str);
//
char a = 'A', b = 'B', c = 'C';
//将变量a, b, c,输入进str字符数组;
//大概理解就是,原本printf函数是将输出的内容打印在终端屏幕上,而sprintf是将输出的内容输出到str字符串中
//理解不了没有太大关系,现在的阶段只要会用就可以
sprintf(str, "%c%c%c", a, b, c);
//再次输出str字符数组
printf("str = %s\n", str);
return 0;
}
结果显示

输入函数

代码实际演示
scanf的用法
#include<stdio.h>
int main() {
//定义
int a, b, n;
//输出提示信息,提示你该输入a,b需要读入的值了
printf("normal scanf, input a, b: ");
//%d整形格式占位符中间可以不加空格
//如果代码成功运行那个scanf就成功读取两个参数也就是a和b,那么n的值就应该为2,因为scanf的返回值为成功读取参数的个数
//对于&符合,现在记着使用scanf时就得使用就可以,在后续的会讲到这个符号是什么作用
n = scanf("%d%d", &a, &b);
printf("a = %d, b = %d\n", a, b);
printf("n = %d\n", n);
printf("normal scanf, input %%dabc%%d: ");
//你如果输入的数据为123abc456那么, a, b的值分别为123, 456, 而'abc'被scanf的格式化吞掉了
//而返回值n的值为2,因为成功读入的参数还是只有a,b两个
n = scanf("%dabc%d", &a, &b);
printf("a = %d, b= %d\n", a, b);
printf("n = %d\n", n);
return 0;
}
最终效果
这里12 14中间要加空格, 不然计算机认为1214就是一个数字读取到变量a中, b就还没有值就还需要再继续输入

补充:利用scanf读入带空格字符串
#include<stdio.h>
int main() {
//创建str字符数组并初始化
char str[100] = {0};
//[]是字符匹配集,意思就是在[]中含有的内容将会读取,反之则不
//^这个字符的意思是非,那么[^\n]的意思就是除\n这个字符以外的都读取
//这里没有用到&,就先记住读取字符数组不用加&这个符号
scanf("%[^\n]s", str);
printf("str = %s\n", str);
return 0;
}
最终效果

sscanf的用法
#include<stdio.h>
int main() {
int a, b;
//定义一个字符数组,并赋值;
char str[100] = "123abc456";
//变量a, b从str字符数组中读取值
//sscanf读入str字符数组中的内容就相当于scanf读取在终端上输入的内容
sscanf(str, "%dabc%d", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
最终效果

基本运算符

基本运算符的代码实现
#include <stdio.h>
int main() {
//定义三个变量
// a = 5就是赋值运算符的用法
int a = 5, b = 2, c = 10;
printf("a = %d, b = %d, c = %d\n", a, b, c);
// a = b也是,可以用一个变量去赋值另一个变量
int s = b;
printf("s = %d\n", s);
// + - * 运算符
printf("a + b = %d\n", a + b);
printf("c - b = %d\n", c - b);
printf("a * b = %d\n", a * b);
// / 运算符
// 这里c / b是可以整除那么得出的值为5
printf("c / b = %d\n", c / b);
// 这里a / b是无法整除的,那么这里有个规则就是向0取整,就是2
printf("a / b = %d\n", a / b);
// 这里d / b 也是无法整除的,那么他向0取整就是-2
int d = -5;
printf("d / b = %d\n", d / b);
//运算符还可以吧运算后的结果去赋值变量也是可以的
int n = a + b;
printf("n = a + b = %d\n", n);
// % 取余运算
// 这里如果需要用printf打印%这个符号就需要用%%
printf("a %% b = %d\n", a % b);
return 0;
}
最终运算

位运算
这里会用到关于二进制的知识, 所以需要提前了解二进制:二进制
&(按位与运算)
这里的&和scanf中的&是同一个符号,但是作用是完全不同的,所以需要区分一下;如图是如何计算的

|(按位或运算)
如图如何计算

^(异或)

~(按位取反)

>>(右移)

<<(左移)

代码实际演示
#include<stdio.h>
//这里的代码先不用去理解,在学习循环后可以再回头来看
//这里的代码作用就是把数字以二进制形式显示出来
void printf_digit(int x) {
for (int i = 31; i >= 0; i--) {
printf("%c", (x & (1 << i)) ? '1' : '0');
}
printf("\n");
return ;
}
int main() {
int a = 5, b = 3;
//输出a和b的二进制形式
printf("a = "); printf_digit(a);
printf("b = "); printf_digit(b);
//与运算和或运算
printf("a & b = "); printf_digit(a & b);
printf("a | b = "); printf_digit(a | b);
//异或
printf("a ^ b"); printf_digit(a ^ b);
printf("a = %d, b = %d\n", a, b);
//如何不用第三个变量交换a, b变量中的值
a ^= b;//这句代码的意思就是a = a ^ b,同理 a += b,就是 a = a + b;需要两个变量的运算符都可以这样
b ^= a;
a ^= b;
//这3句代码,可以在纸上自己画一下这个过程,看是否能交换值
printf("a = %d, b = %d\n", a, b);
//按位取反
printf("~a = "); printf_digit(~a);
//然后下面是看负数是不是通过正数按位取反在+1得到的
printf("a = %d\n", a);
printf("(~a + 1) = %d\n", ~a + 1);
//下面是一个练习,如何取得一个数在二进制中最后一位一,也就是从右往左的一个1;
int x;
scanf("%d", &x);
printf("x = "); printf_digit(x);
printf("-x = "); printf_digit(x);
printf("(-x & x) = "); printf_digit(-x & x);
//左移右移
int c = 123456767, e = -c;
printf("c = "); printf_digit(c);
printf("e = "); printf_digit(e);
//c左移一位
printf("c << 1 = "); printf_digit(c << 1);
//c右移一位
printf("c >> 1 = "); printf_digit(c >> 1);
//e左移一位
printf("e << 1 = "); printf_digit(e << 1);
//e右移一位
printf("e >> 1 = "); printf_digit(e >> 1);
//左移等于这个变量乘以2的结果
printf("c = %d, c << 1 = %d, c / 2 = %d\n", c, c << 1, c * 2);
//右移等于这个变量除以2的结果
//但是/ 是向0取证,但是>>是向下取证
//向下取证就是5 >> 1 = 2,正数和/是没有区别的
//但是负数-5 >> 1 = -3,而-5 / 2 = -2区别在这儿
//所以向下取整的意思就是向小的一端去取证
printf("c = %d, c >> 1 = %d, c / 2 = %d\n", c, c >> 1, c / 2);
return 0;
}
最终效果

运算符优先级
如何理解优先级,就是先计算高优先级的运算符,如果优先级一样,看结合性是从左到右,还是从右到左的;这个需要自己多使用就能记住了,死记硬背的效果永远没有实际操作的效果来的更快;

常用的数学函数

代码演示
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
//double 用%lf展位符,int 用%d占位符
printf("pow(2, 3) = %lf\n", pow(2.0, 3.0));
printf("sqrt(2) = %lf\n", sqrt(2));
printf("ceil(4.1) = %lf\n", ceil(4.1));
printf("floor(4.9) = %lf\n", floor(4.9));
printf("abs(-9) = %d\n", abs(-9));
printf("fabs(-4.56) = %lf\n", fabs(-4.56));
printf("acos(-1) = %lf\n", acos(-1));
return 0;
}
最终效果

章节小结
学完了知识点一定要自己去做题,如果有疑问先带着疑问先去尝试写代码,看自己的想法是否能实现,如果实在想不明白再回头来问老师,这样不仅解决了问题,还加深了你对知识点的记忆。开始是会觉得哪里都不懂,但是慢慢的往后学习,回头来看之前学过的内容你就会发现原来这么简单,直接顿悟。
加油相信自己,你是最NB的。

255

被折叠的 条评论
为什么被折叠?



