C语言万字基础笔记总结(一)下

简介: 简介:C语言学习笔记,记录所学,便于复习。 由于篇幅过大,考虑到观感,准备分多篇记录。学习视频:《带你学C带你飞》IDE:Clion 2021.1.3

五、运算符


image.png

表达式

  • 用运算符和括号将操作数连接起来的式子。

1、算数运算符

Q:那什么是单目和双目呢?


A:一个符号是双目运算符还是单目运算符,取决于它起作用的有多少个操作数。


如:


当“+”取作加号时,1+2,此时,1和2是它起作用的操作数,共两个数,所以此时是双目运算符。

当“+”取作正号时,+3,此时3时它起作用的操作数,共一个数,所以此时是单目运算符。

类型转换

当运算符左右两个操作数类型不同时,编译器会将它们共同转换位某种数据类型,通常情况下,会向精度较大的那个类型转化。


例:

#include <stdio.h>
int main()
{
    printf("i的计算结果:%d\n", 1 + 2); // 假设i=1+2
    printf("j的整型计算结果:%d\n", 1 + 2.0);// 假设j=1+2.0
    printf("j的浮点型计算结果:%f\n", 1 + 2.0);
    return 0;
}


20210715221423209.gif

i的计算结果:3
j的整型计算结果:0
j的浮点型计算结果:3.000000

当然,也可以进行强制转换,如,将上面的代码改一下:

#include <stdio.h>
int main()
{
    printf("j的整型计算结果:%d\n", 1 + (int)2.0);
    return 0;
}

输出结果便是:

j的整型计算结果:3

那如果将2.0改成1.5,那结果是不是按照四舍五入的方法转换成整型的呢?

#include <stdio.h>
int main()
{
    printf("j的整型计算结果:%d\n", 1 + (int)1.5);
    return 0;
}

运算结果是:

j的整型计算结果:2

结果由3变成了2,由此可见,并不是采取四舍五入的方法,而是直接将小数点后面的数字直接置零处理。


2、关系运算符

image.png


关系表达式

  • 用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式。
  • 关系表达式会得到一个值,这个值是逻辑值,真或假;C语言用1表示真,用0表示假。
  • 例:
#include <stdio.h>
int main()
{
    printf("真--运算结果为:%d\n", 1 < 2);
    printf("假--运算结果为:%d\n", 1 > 2);
    return 0;
}

20210716113255660.gif


3、逻辑运算符

  • 三种逻辑运算符

image.png

逻辑表达式

  • 用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式。
  • 例:
#include <stdio.h>
int main()
{
    //1<2为真,2>1为真,两个进行逻辑与运算,结果应为真
    printf("第一个运算结果为:%d\n", 1 < 2 && 2 >1);
    //任何非0的数,在这里就被认为是真,3+1=4,4为真,2==0显然是假,进行逻辑或,结果为真
    printf("第二个运算结果为:%d\n", 3 + 1 || 2 == 0);
    //4为真,进行逻辑非运算,结果为假
    printf("第三个运算结果为:%d\n", !4);
    // !0结果为真,即1,1+1=2显然大于1,故左边结果为假,!7结果为假,进行逻辑或运算,结果假。
    printf("第四个运算结果为:%d\n", !0 + 1 < 1 || !7);
    return 0;
}

20210716115220444.gif

第一个运算结果为:1
第二个运算结果为:1
第三个运算结果为:0
第四个运算结果为:0

短路求值

  • 短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值。

:C语言对于逻辑与逻辑或采用短路求值的方式。

  • 例:
#include <stdio.h>
int main()
{
    int a = 3, b = 3;
    (a = 0) && (b = 5);
    printf("a=%d, b=%d\n",a,b);
    (a = 1) || (b = 5);
    printf("a=%d, b=%d\n",a,b);
    return 0;
}

20210716121733875.gif

a=0, b=3
a=1, b=3

注意:这里b的值一直没变,而a变成了0和1,原因就是C语言中逻辑与和逻辑或采用的是短路求值。


(a = 0) && (b =5),这个是逻辑与运算,它要求左右两边的结果均为真,它的结果才能为真,但是,如果它左边的结果不为真(因为它的运算方式是从左到右),那么就不会对它的右边进行运算了,所以不会对b进行赋值。

(a = 1) || (b =5),这个是逻辑或运算,它要求左右两边结果有一个为真就可以了,(它的运算方式也是从左到右),这里,左边a=1已经成立了,就不需要看右边了,所以也不会对b进行赋值。


六、条件语句

1、if语句

框架如下:

if(表达式)
{
   //这里放逻辑值为真,所执行的语句或程序块
}

根据这个基本的语句,可以进一步的拓展

if(表达式1)
{
    //表达式1为真,执行的语句或程序块
}
else if(表达式2)
{
    //表达式2为真,执行的语句或程序块
}
else if(表达式3)
{
    //表达式3为真,执行的语句或程序块
}
...//此处省略多组else if
else if(表达式n)
{
    //表达式n为真,执行的语句或程序块
}
else
{
    //以上表达式均为假时,执行的语句或程序块
}

注意:当执行的语句只有一句时,{}可省略。

  • 例: 到了大学之后,有些课的成绩是以等级评定的。那么我们就用if条件语句来简单写一个分数评级的程序。其中:

image.png

程序如下:

#include <stdio.h>
int main()
{
    int i;
    printf("请输入你的分数:");
    scanf("%d",&i); // 获取键盘输入的值
    if (i >= 90)
    {
        printf("你成绩的等级为优!");
    }
    else if(i >= 80 && i < 90)
    {
        printf("你的成绩等级为良!");
    }
    else if(i >= 70 && i < 80)
    {
        printf("你的成绩等级为中!");
    }
    else if(i >= 60 && i < 70)
    {
        printf("你的成绩等级为及格!");
    }
    else if(i >= 0 && i < 60)
    {
        printf("很遗憾,你没有及格,请及时补考!");
    }
    else
    {
        printf("你输入的成绩不符合规定哟,请重新输出!!!");
    }
    return 0;
}

20210716143431518.gif

请输入你的分数:95
你成绩的等级为优!

本例输入的成绩为95,等级评定正确,小伙伴也可以自己尝试一下,不同的成绩哟。

scanf函数的用法,可参考:C语言scanf函数用法完全攻略

条件运算符

也是C语言中唯一一个三目运算符

  • 语法:exp1 ? exp2 : exp3

image.png

条件运算符只适合比较简单的语句。

if (a > b)
    max = a;
else
    max = b;


上述语句用条件运算符来写,即:

max = a >b ? a :b

2、switch语句

框架如下:

    switch (表达式) 
    {
        case 常量表达式1:  语句或程序块1
        case 常量表达式2:  语句或程序块2
        ...
        case 常量表达式n-1:  语句或程序块n-1
        case 常量表达式n:  语句或程序块n
        default:语句或程序块n+1  // default为可选项,可以不写
    }

当表达式的结果与常量表达式中的结果一致时,则执行想对应的语句或程序块。当没有结果一致时,则执行default中的语句或程序块,如果没有default这部分,则编译器没有任何动作,并不会报错。


例: 利用switch对上述例子进行修改。 有时候,老师给的评分是ABCD这类,那我们可以这样实现查看成绩等级。

image.png

程序如下:

#include <stdio.h>
int main()
{
    char i;
    printf("请输入你的分数字母等级:");
    scanf("%c",&i);
    switch (i)
    {
        case 'A': printf("你的成绩等级是优!\n");break;
        case 'B': printf("你的成绩等级是良!\n");break;
        case 'C': printf("你的成绩等级是中!\n");break;
        case 'D': printf("你的成绩等级是及格!\n");break;
    }
    return 0;
}

image.gif

请输入你的分数字母等级:A
你的成绩等级是优!

本例输入的分数字母等级为A,等级评定正确,小伙伴也可以自己尝试一下,不同的成绩哟。

  • 注意:细心的小伙伴可能发现,这个程序,比框架中,多了一个break。其实是这样的,break语句,是用来跳出switch语句的。

如果我把break删掉,仍然输入A,让我们来看一下结果:

请输入你的分数字母等级:A
你的成绩等级是优!
你的成绩等级是良!
你的成绩等级是中!
你的成绩等级是及格!

这显然不是我们想要的结果。

3、分支结构的嵌套

也不是很难理解,就是在if语句中嵌套if语句。

直接看例子吧。

  • 例: 比较两个数的大小关系。

(用上面讲的两种也可以实现,但是我们要练习一下嵌套)

程序如下:

#include <stdio.h>
int main()
{
    int a, b;
    printf("请输入你想比较的两个数(两个数中间用空格分开): ");
    scanf("%d %d", &a, &b);
    if (a != b)
    {
        if (a > b)
        {
            printf("%d > %d\n", a, b);
        }
        if (a < b)
        {
            printf("%d < %d\n", a, b);
        }
    }
    else
    {
        printf("%d = %d\n", a, b);
    }
    return 0;
}

20210716153026705.gif

请输入你想比较的两个数(两个数中间用空格分开):51 15
 51 > 15

由此可见,结果正确。分支结构的嵌套是不是也很简单呀~


七、循环语句


1、while语句

框架很简单

while(表达式)
      循环体
  • 例:计算1+2+…+99+100
    想必这个例子大家也非常的熟悉,那如何用while循环来实现呢?


程序如下:

#include <stdio.h>
int main()
{
    int i = 1, sum = 0;
    while(i <= 100)
    {
        sum = sum + i;
        i = i + 1;
    }
    printf("计算结果为:%d", sum);
    return 0;
}

image.gif

计算结果为:5050

结果正确!

2、do…while语句

框架为:

do
    循环体
while(表达式)
  • 与while语句不同的是,while语句是先判断再执行,而do…while语句是先执行再判断。

3、for循环

框架为:

for(表达式1;表达式2;表达式3)
    循环体


image.png

值得一提的是,表达式1,表达式2,表达式3可以按照需要进行省略
(但是分号不能省!!!!)如:
for(;表达式2;表达式3)
for(表达式1;;表达式3)
for(表达式1;;)
for(;;)
而for(;;)和
while(1)
{
...
}
的作用是一样的
  • 例:用for循环来计算1+2+…+99+100
#include <stdio.h>
int main()
{
    int i = 0;
    int count;
    for (count = 1;count <= 100;count++)//count++的意思就是count = count + 1
    {
        i = i + count;
    }
    printf("计算结果为:%d", i);
    return 0;
}

计算结果为:5050

结果依然是正确的!

  • i++和++i是什么意思,有什么区别?
    i ++ 是先赋值后加;++ i 是先加后赋值。

用例子来理解一下:

#include <stdio.h>
int main()
{
    int i = 5 , j, k;
    j = ++i;
    printf("++i的计算结果为:%d\n", j);
    i = 5;  //对i重新赋值
    k = i++;
    printf("i++的计算结果为:%d\n", k);
    return 0;
}

结果为:

++i的计算结果为:6
i++的计算结果为:5

正好验证了刚刚所说,i ++ 是先赋值后加;++ i 是先加后赋值。

4、循环结构的嵌套

既然有分支结构的嵌套,那循环结构肯定也可以。

  • 例:打印九九乘法表

程序如下:

#include <stdio.h>
int main()
{
    int i , j;
    for (i = 1;i <= 9;i++)
    {
        for (j = 1;j <= i;j++)
        {
            printf("%d*%d=%d  ",i, j, i * j);
        }
        putchar('\n');//向终端输入一个换行符,用于换行
    }
    return 0;
}

image.gif

1*1=1
2*1=2  2*2=4
3*1=3  3*2=6  3*3=9
4*1=4  4*2=8  4*3=12  4*4=16
5*1=5  5*2=10  5*3=15  5*4=20  5*5=25
6*1=6  6*2=12  6*3=18  6*4=24  6*5=30  6*6=36
7*1=7  7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49
8*1=8  8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64
9*1=9  9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

image.png

八、break语句和continue语句


当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。


break如果用于循环是用来终止循环

break如果用于switch中,则是用来终止switch

break用在多层循环中,表示退出里他最近的一次循环。


continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。


例:

#include <stdio.h>
int main()
{
    int i, j;
    for (i = 0;i < 4;i++)
    {
        for (j = 0;j < 4;j++)
        {
            if (j == 1)
            {
                break;
            }
            printf("i=%d,j=%d\n", i, j);
        }
    }
    return 0;
}

image.gif

i=0,j=0
i=1,j=0
i=2,j=0
i=3,j=0
  • 使用continue语句:
#include <stdio.h>
int main()
{
    int i, j;
    for (i = 0;i < 4;i++)
    {
        for (j = 0;j < 4;j++)
        {
            if (j == 1)
            {
                continue;
            }
            printf("i=%d,j=%d\n", i, j);
        }
    }
    return 0;
}

20210716201449998.gif

i=0,j=0
i=0,j=2
i=0,j=3
i=1,j=0
i=1,j=2
i=1,j=3
i=2,j=0
i=2,j=2
i=2,j=3
i=3,j=0
i=3,j=2
i=3,j=3

九、未完待续


这一阶段的笔记就先记录到这里,但学C的道路还很漫长。。。

路漫漫其修远兮,吾将上下而求索。

大家一起加油吧!

相关文章
|
6月前
|
存储 人工智能 算法
【C语言】自学终极笔记
【C语言】自学终极笔记
106 0
|
3月前
|
测试技术 C语言 C++
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
【C语言刷题训练——6】鹏哥C语言刷题训练营笔记,含代码讲解改进
|
3月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
5月前
|
C语言
|
5月前
|
C语言
|
6月前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
74 0
|
存储 编译器 C语言
C语言笔记第03章:数组(四)
C语言笔记第03章:数组
95 0
|
编译器 C语言 索引
C语言笔记第03章:数组(一)
C语言笔记第03章:数组
104 0
|
6月前
|
NoSQL Redis C语言
|
12月前
|
C语言
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)