这篇笔记主要内容是简单介绍C语言的printf()、scanf()、运算符的知识。阅读本文大概需要 5 分钟。
Day03 郝斌C语言自学视频之C语言基本输入输出&运算符
1. 基本的输出函数printf()
1.1 printf()四种用法:
- printf(“字符串\n”);
- printf(“输出控制符”, 输出参数);
- printf("输出控制符1 输出控制符2 输出控制符3 ", 输出参数1, 输出参数2, 输出参数3… ); // 输出控制符和输出参数个数必须一一对应。
- printf("输出控制符 非输出控制符 ", 输出参数);
输出控制符包含如下:
输出控制符 | 数据类型 |
---|---|
%d | int |
%ld | long int |
%c | char |
%f | float |
%lf | double |
%x(或%X, %#X) | int 或 long int 或 short int |
%s | 字符串 |
基本用法测试:
# include <stdio.h>
int main(void)
{
// printf("哈哈!\n"); // \n表示换行
// int i = 10;
// printf("i = %d\n", i); // d是十进制
int j = 3;
int k = 5;
// printf("%d %d\n", j, k); // OK
// printf("%d\n", j, k); // error 输出控制符和输出参数个数不匹配
printf("i = %d, j = %d\n", j, k);
return 0;
}
%x %X %#X %#x
的用法测试:
/*
2020年02月16日21:40:48
功能:
目的:
测试 %x %X %#X %#x 的用法
*/
# include <stdio.h>
int main(void)
{
int x = 47; // 49是十进制
printf("%d\n", x); // 十进制输出
printf("%x\n", x); // 十六进制输出,输出结果是:2f
printf("%X\n", x); // 十六进制输出,输出结果是:2F
printf("%#X\n", x); // 十六进制输出,输出结果是:0X2F %#X推荐使用
printf("%#x\n", x); // 十六进制输出,输出结果是:0x2f
return 0;
}
/*
在VSCode中的输出结果是:
--------------------------
47
2f
2F
0X2F
0x2f
--------------------------
总结: %#X推荐使用
*/
1.2 为什么需要输出控制符?
- 01组成的代码可以表示数据也可以表示指令。
- 如果01组成的代码表示的是数据的话,那么同样的01代码组合以不同的输出格式输出,就会有不同的输出结果。换句话说就是
映射关系不一样,得到的结果就会不同
。
2. 基本的输入函数scanf()
2.1 scanf()基本用法
通过键盘将数据输入到变量中。两种用法:
- 用法一:scanf(“输入控制符”, 输入参数);
功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。 - 用法二:scanf(“非输入控制符”, 输入参数);
功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
非输入控制符必须原样输入
。
用法一,不含非输入控制符测试:
# include <stdio.h>
int main(void)
{
int i;
// i = 10;
scanf("%d", &i); // &i表示i的地址 &是一个取地址符
printf("i = %d\n", i);
return 0;
}
用法二,含非输入控制符测试:
# include <stdio.h>
int main(void)
{
int i;
scanf("m%d", &i); // m123 合法的输入, 123是非法的输入
printf("i = %d\n", i);
return 0;
}
2.2 如何使用scanf编写出高质量代码
- 使用
scanf()
之前最好先使用printf()
提示用户以什么样的方式来输入。 - scanf中尽量不要使用非输入控制符,尤其不要用
\n
。 - 增强代码的鲁棒性,容错性。即能对用户的非法输入进行适当处理【非重点】。
scanf()
测试:
# include <stdio.h>
int main(void)
{
int i;
char ch;
scanf("%d", &i);
printf("i = %d\n", i);
// ......
// 这段代码可以避免用户i输入错误,从而影响j的输入
while ( (ch=getchar()) != '\n')
continue;
int j;
scanf("%d", &j);
printf("j = %d\n", j);
return 0;
}
3. 运算符
3.1 算术运算符
算数运算 | 算数运算符 |
---|---|
加 | + |
减 | - |
乘 | * |
除 | / |
取余 | % |
这里需要注意:
- C语言中除法的运算结果与运算对象的数据类型有关,两个数都是int,则商就是int,若有小数,则直接把小数部分舍弃,不会四舍五入;若被除数和除数中有一个或两个是浮点型数据,则商也是浮点数,即向更大的数据类型靠拢。
/
用法测试:
/*
时间:2020年2月18日18:12
目的:
测试C语言中除法运算符'/'的用法
总结:
1. C语言中,两个int相除,所得结果,直接舍弃小数部分,不会四舍五入,如:19/4 = 3
2. C语言中,除数和被除数只要有一个是浮点数,结果就是浮点型,会带上小数部分。
3. 输出控制符与变量类型必须严格一致,整型不能用%f,否则会出错。
*/
# include <stdio.h>
int main(void)
{
int i, j, k;
float m, n;
i = 19;
j = 3;
k = 4;
m = 19.0;
n = 4.0;
// C语言中两个int相除,直接舍弃小数部分,不会四舍五入
printf("%d/%d = %d\n", i, j, i/j);
printf("%d/%d = %d\n", i, k, i/k);
// printf("%d/%d = %d\n", i, n, i/n); // 输出:19/0 = 0
// printf("%d/%f = %d\n", i, n, i/n); // 输出:19/4.000000 = 0
printf("%d/%f = %f\n", i, n, i/n); // 正确输出:19/4.000000 = 4.750000
printf("i = %f\n", i); // 输出 i = 0.000000,被舍弃了整数部分
printf("%f/%d = %f\n", m, j, m/j); // 正确输出:19.000000/3 = 6.333333
return 0;
}
/*
在VSCode中的输出结果是:
--------------------------
19/3 = 6
19/4 = 4
19/4.000000 = 4.750000
i = 0.000000
19.000000/3 = 6.333333
--------------------------
*/
- C语言中的取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号
只取决于被除数
,与被除数保持保持一致。
%
用法测试:
/*
时间:2020年2月18日18:32
目的:
测试C语言中除法运算符'%'的用法
总结:
1. C语言中,%两个数必须是整数,出现浮点数报错
2. C语言中,%所得余数的结果符号与被除数相同,与除数无关
*/
# include <stdio.h>
int main(void)
{
int i, j, m, n;
float k;
i = 5;
j = 3;
m = -5;
n = -3;
k = 2.0;
// C语言中两个int相除,直接舍弃小数部分,不会四舍五入
printf("%d%%%d = %d\n", i, j, i%j); // 输出结果:5%3 = 2
printf("%d%%%d = %d\n", i, n, i%n); // 输出结果:5%-3 = 2
printf("%d%%%d = %d\n", m, j, m%j); // 输出结果:-5%3 = -2
printf("%d%%%d = %d\n", m, n, m%n); // 输出结果:-5%-3 = -2
// printf("%d%%%f = %f\n", i, k, i%k); // error
return 0;
}
/*
在VSCode中的输出结果是:
--------------------------
5%3 = 2
5%-3 = 2
-5%3 = -2
-5%-3 = -2
--------------------------
*/
3.2 关系运算符
关系运算 | 关系运算符 |
---|---|
大于 | > |
大于等于 | >= |
小于 | < |
小于等于 | <= |
不等于 | != |
等于 | == |
3.3 逻辑运算符
逻辑运算 | 逻辑运算符 |
---|---|
非 | ! |
与 | &&,全真为真,一假全假 |
或 | || , 全假为假,一真全真 |
C语言对真假的处理:非零是真,零是假。
注意:&&和||均遵守逻辑短路原则,即偷懒原则。如果已经能判断结果,那么后面的判断就不会执行。
A && B,如果A假,则B不会再执行。
A || B,如果A真,则B也不会再执行。
&&
和||
用法测试:
/*
时间:2020年2月18日21:14
目的:
测试C语言中’&&'和'||'的用法
总结:
1. A && B,如果A假,则B不会再执行
2. A || B,如果A真,则B也不会再执行
*/
# include <stdio.h>
int main(void)
{
int k = 20;
int i = 10;
int j = 30;
int m;
// 注意对比这里的 k==5 和 k=5 的区别,前者是逻辑判断,后者是重新赋值
m = (3>2) && (k==5);
printf("m = %d, k = %d\n", m, k); // 输出结果:m = 0, k = 20,这里k没有被重新赋值
m = (3>2) && (k=5);
printf("m = %d, k = %d\n", m, k); // 输出结果:m = 1, k = 5,这里k被重新赋值
// 注意这里的短路原则,能不运算就不运算,能偷懒就偷懒,设计哲学
m = (1>2) && (i=5);
printf("m = %d, i = %d\n", m, i); // 输出结果:m = 0, i = 10,这里因为 1>2 不成立,所以i=5没有执行,故 i初始值10
m = (3>2) && (i=5);
printf("m = %d, i = %d\n", m, i); // 输出结果:m = 1, i = 5,这里因为 3>2 成立,所以i=5执行,i重新赋值为5
m = (3>2) || (j=5);
printf("m = %d, j = %d\n", m, j); // 输出结果:m = 1, j = 30,这里因为 3>2 成立,所以j=5不执行,故 j初始值30
m = (1>2) || (j=5);
printf("m = %d, j = %d\n", m, j); // 输出结果:m = 1, j = 5,这里因为 1>2 不成立,所以j=5执行,j重新赋值为5
return 0;
}
/*
在VSCode中的输出结果是:
--------------------------
m = 0, k = 20
m = 1, k = 5
m = 0, i = 10
m = 1, i = 5
m = 1, j = 30
m = 1, j = 5
--------------------------
*/
3.4 赋值运算符
赋值运算 | 赋值运算符 |
---|---|
等于 | = |
加等于 | += |
减等于 | -= |
除等于 | /= |
乘等于 | *= |
3.5 优先级别
算术 > 关系 > 逻辑 > 赋值
【说明】
- 本学习笔记整理自B站郝斌老师的《郝斌C语言自学教程》片段P31-P46。
- 笔记中所有代码均在windows10操作系统,在VSCode编辑器中通过测试。具体VSCode C语言开发环境搭建方法请参照我的另一篇CSDN博客——Windows10下利用Visual Studio Code搭建C语言开发环境。
后记
如果对你有所帮助,欢迎关注我的公众号。这个公众号主要是慢慢分享和记录自己学习编程的笔记,比如:C,Python,Java等。后续也会分享自己面试以及在职场上的成长心得。