Day03 郝斌C语言自学视频之C语言基本输入输出&运算符

这篇笔记主要内容是简单介绍C语言的printf()、scanf()、运算符的知识。阅读本文大概需要 5 分钟。

1. 基本的输出函数printf()

1.1 printf()四种用法:

  1. printf(“字符串\n”);
  2. printf(“输出控制符”, 输出参数);
  3. printf("输出控制符1 输出控制符2 输出控制符3 ", 输出参数1, 输出参数2, 输出参数3… ); // 输出控制符和输出参数个数必须一一对应。
  4. 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 为什么需要输出控制符?

  1. 01组成的代码可以表示数据也可以表示指令。
  2. 如果01组成的代码表示的是数据的话,那么同样的01代码组合以不同的输出格式输出,就会有不同的输出结果。换句话说就是映射关系不一样,得到的结果就会不同

2. 基本的输入函数scanf()

2.1 scanf()基本用法

通过键盘将数据输入到变量中。两种用法:

  1. 用法一:scanf(“输入控制符”, 输入参数);
    功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
  2. 用法二: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编写出高质量代码

  1. 使用scanf()之前最好先使用printf()提示用户以什么样的方式来输入。
  2. scanf中尽量不要使用非输入控制符,尤其不要用\n
  3. 增强代码的鲁棒性,容错性。即能对用户的非法输入进行适当处理【非重点】。

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 算术运算符

算数运算 算数运算符
+
-
*
/
取余 %

这里需要注意:

  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
--------------------------

*/
  1. 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 优先级别

算术 > 关系 > 逻辑 > 赋值

说明

  1. 本学习笔记整理自B站郝斌老师的《郝斌C语言自学教程》片段P31-P46
  2. 笔记中所有代码均在windows10操作系统,在VSCode编辑器中通过测试。具体VSCode C语言开发环境搭建方法请参照我的另一篇CSDN博客——Windows10下利用Visual Studio Code搭建C语言开发环境

后记

如果对你有所帮助,欢迎关注我的公众号。这个公众号主要是慢慢分享和记录自己学习编程的笔记,比如:C,Python,Java等。后续也会分享自己面试以及在职场上的成长心得。

在这里插入图片描述

发布了128 篇原创文章 · 获赞 157 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_27283619/article/details/104533991