🌭个人主页: 起名字真南
🍿个人专栏:【数据结构初阶】【C语言】
目录
1 算术操作符
C语言中为了方便运算,提供了一系列的操作符,而其中有一组操作符叫做:算数操作符。分别是 +、-、*、/、%。
注:操作符也叫做运算符。
1.1 + 和 -
+ 和 - 是用来做加法和减法的。
+ 和 - 都是有两个操作数的,位于操作符两端的就是他们的操作数,这种操作符也叫做双目操作符。
int main() { int x = 100 + 100; int y = 50 - 42; printf("%d\n", x); printf("%d\n", y); return 0; }
1.2 *
运算符 * 用来运算乘法。
#include <stdio.h> int main() { int num = 5; printf("%d\n", num * num); // 输出 25 return 0; }
1.3 /
/ 用来运算除法
除号两端如果都是整数,执行的是整数除法,得到的结果也是整数。
#include <stdio.h> int main() { float x = 6 / 4; int y = 6 / 4; printf("%f\n", x); // 输出 1.000000 printf("%d\n", y); // 输出 1 return 0; }
我们可以看到,虽然变量x的类型是 float(浮点型),但是6 / 4得到的结果1.0,而不是1.5.原因就在于C语言里面的都是整数除法,只会返回整数部分,舍弃小数部分。
那如果想得到浮点型的运算结果应该怎么办呢?我们上面说到如果两端都是整数会执行整数除法,所以我们只需要将两端的操作数变成浮点型就可以得到浮点型的结果。
两个运算数必须至少有一个浮点数。
#include <stdio.h> int main() { float x = 6.0 / 4; int y = 6 / 4; printf("%f\n", x); // 输出 1.500000 printf("%d\n", y); // 输出 1 return 0; }
把6换成 6.0或者把 4换成4.0都可以得到想要的结果。
在看一个例子:
int main() { int x = 5; x = (x / 10) * 100; printf("%d", x); return 0; }
输出结果:
稍微一看可能觉得输出的结果是50,可是结果却是0,是因为因为/的两端都是整数所以进行的是整数除法只保留小数点以前的数,所以 0*100 = 0,而我们想得到50只需要把10改成10.0。
那么可不可以把100改成100.0呢?
结果:
我们可以看到结果依旧是0,这是为什么呢?在这里我们就要考虑到一个算数优先级的问题,在这个式子中是从左到右进行计算,所以先算除法,但是除法两端的操作数都是整数所以得到的是0导致最后的结果也是0。所以我们应该注意将合适的数字改成浮点型。
1.4 %
运算符%表示进行模运算,即返回两个整数相除的余数,这个运算符只能用于整数,不能用用于浮点数。
include <stdio.h> int main() { int x = 8 % 6; // 2 return 0; }
负数求模的规则是根据第一个运算数的符号来确定结果的正负。
#include<stdio.h> int main() { printf("%d\n", 12 % 7); // 5 printf("%d\n", -12 % -7); // -5 printf("%d\n", -12 % 7); // -5 printf("%d\n", 12 % -7); // 5 return 0; }
2 赋值操作符 :=
在变量创建的时候给一个初始值叫做初始化,在变量创建好后,在给一个值叫做赋值。
赋值操作符 ‘ = ’是一个可以随时给变量赋值的操作符
int a = 1;//初始化 a = 2;//赋值,这⾥使⽤的就是赋值操作符
2.1 复合赋值符
在写代码的时候我们可能用到对一个变量进行自增自减的操作
#include<stdio.h> int main() { int a = 1; a = a + 1; a = a - 1; return 0; }
在C语言中提供了更加方便的写法:
#include<stdio.h> int main() { int a = 1; a += 1; a -= 1; return 0; }
C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
//1 += -= //2 *= /= %= //下面的以后会解释 //3 >>= <<= //4 &= |= ^=
3 单目操作符
前⾯介绍的操作符都是双⽬操作符,有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数,被称
为单⽬操作符。 ++、–、+(正)、-(负) 就是单⽬操作符的。
3.1 ++和- -
++是⼀种⾃增的操作符,⼜分为前置++和后置++,–是⼀种⾃减的操作符,也分为前置- -和后置- -.
a++(后置加加) ++a(前置加加) a--(后置减减) --a(前置减减)
int main() { int a = 10; int b = a++; printf("a = %d b = %d", a, b); }
大家可以猜一下输出的结果
代码结果:
我们可以看到a的值是11,b的值是10。这是为什么呢?
首先我们要先了解前置和后置的区别,顾名思义前置就是在前面,先进行操作,后置就是在后面,后进行操作。我们这里用到的是后置。所以是先使用后操作,先使用a = 10的值赋给b在进行自增操作a ++ = a +1。--的操作方法和逻辑与++相同
4 强制类型转换
操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:
代码:
int a = 3.14 //因为a是整形 3.14是浮点型,类型不一致有的编译器会报错
为了避免这样的错误我们可以进行强制类型转换
int a = (int)3.14 //将3.14强制转换成整数类型,这样只会保留整数部分
注意:除非特殊情况下,尽量不要使用
5 printf 和 scanf
5.1 printf
将格式指向的 C 字符串写入标准输出 (stdout)。如果 format 包含格式说明符(以 % 开头的子序列),则格式后面的其他参数将被格式化并插入到生成的字符串中,以替换其各自的说明符。
5.1.1 基本用法
printf()的作用是将参数文本输出到屏幕上。其中的f代表format(格式化),表示可以定制输出文本的格式。
printf() 是在标准库的头⽂件stdio.h 定义的。使⽤这个函数之前,必须在源码⽂件头部引⼊这个头⽂件。
#include<stdio.h> int main() { printf("Hello C"); return 0; }
这样就会在屏幕上输出一行 “ Hello C ”,并且光标会到末尾,如果想让光标到下一行则可以在末尾加上 \n。
5.1.2 占位符
printf()可以在输出文本中指定占位符。
而所谓的“ 占位符 ”,就是这个位置可以被代替。
#include <stdio.h> int main() { printf("There are %d peoples\n", 2); return 0; }
上⾯⽰例中, There are %d peoples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这⾥代⼊的值必须是⼀个整数。
printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 2 替换 %d 。执⾏后的输出结果就是 There are 2 peoples 。
输出文本里面可以出现多个占位符:
printf("%s says you are %d years old","nan",18);
上面的示例中我们可以看到有两个占位符 %d 和 %s,其中%s就是用来打印字符串的占位符,对应的参数分别是 %s 对应 “nan”%d 对应 18 他们的顺序不能改变,如果一个语句中的占位符多于参数个数,那么就会出错进而输出内存中的任意值。
5.1.3 占位符列举
printf() 的占位符有许多种类,与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序,列出常⽤的占位符,⽅便查找,具体含义在后⾯章节介绍。
- %a : ⼗六进制浮点数,字⺟输出为小写。
- %A : ⼗六进制浮点数,字⺟输出为⼤写。
- %c : 字符
- %d : 十进制整数
- %e : 使⽤科学计数法的浮点数,指数部分的 e 为小写。
- %E : 使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
- %i : 整数,基本等同于 %d 。
- %f : ⼩数(包含 float 类型和 double 类型)。
- %g : 6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写 - %G : 等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
- %hd : ⼗进制 short int 类型。
- %ho : ⼋进制 short int 类型。
- %hx : ⼗六进制 short int 类型。
- %hu : unsigned short int 类型。
- %ld : ⼗进制 long int 类型。
- %lo : ⼋进制 long int 类型。
- %lx : ⼗六进制 long int 类型。
- %lu : unsigned long int 类型。
- %lld : ⼗进制 long long int 类型。
- %llo : ⼋进制 long long int 类型。
- %llx : ⼗六进制 long long int 类型。
- %llu : unsigned long long int 类型。
- %Le : 科学计数法表⽰的 long double 类型浮点数。
- %Lf : long double 类型浮点数。
- %n : 已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
- %o : 八进制整数
- %p : 指针
- %s : 字符串
- %u : 无符号整数
- %x : 十六进制整数
- %zd : size_t 类型
- %% : 打印一个百分号
5.1.4 输出格式
printf() 可以定制占位符的输出格式。
5.1.4.1 限定宽度
printf()允许限定占位符的最小宽度
int main() { printf("%5d", 123); printf("%d", 123); return 0; }
结果演示:
在上面的示例中,%5d表示这个占位符的宽度最少为5位,如果不满5位,对应的值前面会补上空格。输出的值默认是右对齐,即输出内容前面会有空格。如果希望改成左对齐,在输出内容后面加上空格可以在占位符%的后面加上-号。
#include<stdio.h> int main() { printf("%5d\n", 123); printf("%d\n", 123); printf("%-5d\n", 123); return 0; }
输出结果:
在最后一个输出结果中123的后面多了两个空格。
对于小数来说,这个限定符会限定所有数字的最小显示宽度。
#include<stdio.h> int main() { printf("%12f", 123.45); printf("%-2d\n",11); return 0; }
输出结果:
从上面的示例中我们可以看到只是前面多加了两个空格,因为%12f表示输出的浮点数最小的显示宽度不能小于12,由于小数的默认显示精度是小数点的后六位,所以输出结果的前面会加两个空格。(小数点也占一位)
5.1.4.2 显示正负号
默认情况下,printf()不对正数显示正号,只对负数显示负号。如果也想让正数输出正号就可以在%的后面加上+。
#include <stdio.h> int main() { printf("%+d\n", 12); // 输出 +12 printf("%+d\n", -12); // 输出 -12 return 0; }
上⾯⽰例中, %+d 可以确保输出的数值,总是带有正负号。
5.1.4.3 限制小数位数
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写成 %.2f 。
#include <stdio.h> int main() { printf("Number is %.2f\n", 3.14); printf("Number is %f\n", 3.14); return 0; }
输出结果:
这种写法可以与限定宽度占位符结合使用
#include <stdio.h> int main() { printf("Number is %.2f\n", 3.14); printf("Number is %f\n", 3.14); printf("Number is %6.2f\n", 3.14); return 0; }
结果演示:
从上面的实例可以看到,代码为右对齐,最小显示宽度为6位,结果前面有两个空格,并且小数点只显示后两位。
最小宽度和小数位数这两个限定值都可以用 * 来代替,通过printf()参数传入
printf("Number is %*.*f\n", 6, 2, 3.14);
上⾯示例中, %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 传⼊。
5.1.4.4 输出部分字符串
%s 用来输出字符串,默认是全部输出。如果只想输出一部分。可以用“ % .长度 s ”,来指定输出的长度,其中长度是一个数字。
#include <stdio.h> int main() { printf("%.5s", "Hello World"); return 0; }
注意在数字的前面还有一个 " . "
5.2 scanf
从 stdin(标准输入) 读取数据并根据参数格式将他们存储到附加参数所指的位置。
其他参数应指向已分配的对象,该对象的类型由格式字符串中的相应格式说明符指定。
5.2.1 基本用法
当我们有了变量,我们需要给变量输入值就可以使用 scanf 函数,如果需要将变量的值输出到屏幕上就可以使用 printf 函数
#include <stdio.h> int main() { printf(" 身高计算器\n"); int height = 0; printf("请输入你的身高: "); scanf("%d", &height); printf("你的身高是:%d(cm)\n", height); return 0; }
输出结果:
scanf()函数读取用户的键盘输入。程序运行到这个语句是就会停下来等待用户输入。用户输入数据后按下回车键,scanf()就会读取用户的输入并存到变量中。其原型定义在头文件<stdio.h>中,
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。
这是因为C语言都是由数据类型的,scanf()必须提前知道用户要输入的数据类型,才能进行处理。它的其余参数就是存放用户输入的变量,格式字符串里面由多少个占位符,就有多少个变量。的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个变量。上⾯⽰例中, scanf() 的第⼀个参数 %d ,表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位符, % 是占位符的标志, d 表⽰整数。第⼆个参数 &i 表⽰,将⽤⼾从键盘输⼊的整数存⼊变量i 。
下面是一次将键盘多个输入存入多个变量的例子:
scanf("%d %d %f %f", &i, &j, &x, &y);
这个例子表示一共要存放的例子由四个 两个整形分别存入 i 和 j 两个浮点型村别存入 x 和 y。scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。所以不管用户所输入的数据之间由多少空格或是使用回车进行换行都不影响。
scanf()处理用户输入的原理是先将用户的数据放入缓存中,等到按下回车键再按照占位符对缓存数据进行解读。
解读用户输入时,会从上一个解读遗留的第一个字符开始,直到读完缓存或者遇到第一个不符合条件的字符为止。
int main() { int x = 0; float y = 0; //用户输入:25.436# scanf("%d", &x); printf("x = %d \n", x); scanf("%f", &y); printf("y = %f", y); return 0; }
结果:
在上面的示例中scanf()%d 从2开始读取数据读取到25停下来,因为“.”不属于int类型所以属于不符合条件的字符,不是属于整数的有效字符。然后%f 开始从“ . ”开始读取到 .436,后面的#属于不符合条件的字符所以停止读取。
5.2.2 scanf的返回值
scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者失败,则返回0如果在成功读取任何数据之前,发⽣了读取错误或
者遇到读取到⽂件结尾,则返回常量 EOF。