类型与变量
概念
类型是定义变量的,什么是类型,例如张三是一个人,张三就是变量而人就是类型,什么是变量就是用来存储数据的,为什么变量会分为很多类型,因为存储的数据类型不同,需要不容的类型来定义变量好让计算机识别。
代码带入
#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 & 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的。