🌭个人主页: 起名字真南
🍿个人专栏:【数据结构初阶】 【C语言】
目录
1 算术操作符
注:操作符也叫做运算符。
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 单目操作符
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
5.1.1 基本用法
#include<stdio.h>
int main()
{
printf("Hello C");
return 0;
}
这样就会在屏幕上输出一行 “ Hello C ”,并且光标会到末尾,如果想让光标到下一行则可以在末尾加上 \n。
5.1.2 占位符
#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 占位符列举
- %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 类型
- %% : 打印一个百分号