c语言学习笔记3(关系运算、逻辑运算与控制语句)

 c语言中的运算:

四则运算:+-*/%()

赋值运算:=、+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=、++、--

关系运算:==、!=、>、>=、<、<=

逻辑运算:!、&&、||

 关系运算

---关系运算符也被称为关系操作符、比较运算符等。

c语言提供了六个关系运算符:

  • ==  相等         // c语言中"="是赋值运算符,“==”是相等运算符。
  • !=   不相等
  • >    大于
  • >=  大于等于
  • <    小于
  • <=  小于等于

        关系运算符的结果是一个逻辑值,逻辑值只有两种可能的值:true(真,表示成立)或false(假,表示不成立)。c语言规定1为true,0为false  逻辑值也被称为逻辑量。

        printf("%d",2>3);        //判断为false,值为false,打印结果为0.

        printf("%d",2<3);        //判断为true,值为true,打印结果为1

计算机中连续的关系运算是从左到右依次进行的。这与数学中的比较还是有很大区别的。

        6>5>4   //6>5先进行运算,得到1,然后1>4进行运算,值为0.所以判断为假。

        a==b==6  //a==b先进行运算,得到结果可能是0,也可能是1.然后判断是否与6相等。结果肯定为假。

优先级:

==、!=的优先级比其他的优先级更低

        5>3==6>4  //5>3优先运算,结果为1,6>4随后运算,结果也为1,最后运算1==1,值为true。可以理解为5>3是否等于6>4.

关系运算符比算术运算符的优先级更低,但比赋值运算的优先级高。

        a=1==1+2<=2  //1+2优先运算,值为3,随后3<=2运算值为false,为0,最后运算1==0,值为false,为0。最终将0赋值给a。

 逻辑运算

---逻辑运算是针对逻辑量进行的运算,结果只有0或者1。

        逻辑量(逻辑值)是关系运算或者逻辑运算的结果。是真与假,是true与false,是1与0。

        逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式

  • !:非    //逻辑值取反运算(改变逻辑值的真或假,若逻辑值为true,则逻辑运算为false,若逻辑值为false,则逻辑运算后为true。)
  • &&:与   //两侧逻辑值都为true,则逻辑运算结果为true。否则为false。
  • ||:或      //两侧逻辑值至少有一个为true时,运算结果为true。否则为false。

 判断5月、6月、7月、8月是雨季,判断12月、1月、2月、3月是旱季。

        int month=0;

        scanf("%d",&month);

        if(month>=5 && month<=8)

               printf("是雨季");

        if(month==12 || month>=1 && month<=3)

                printf("是旱季");

 优先级:

 !优先级高于&&,&&高于||。

逻辑运算符普遍低于关系运算符。

优先级额外规定:单目运算符优先级高于双目运算符。!是单目运算符

算子又称为操作数,操作目,操作值,运算数(笔记2内容)

四则运算与关系运算等运算符都有两个算子,被称为双目操作符。

+-在四则运算中是双目操作符,但它们还可以表示正负号,在表示正负号时是单目操作符。逻辑!只有一个操作数是单目操作符。++、--也是单目操作符。

短路

---逻辑运算是从左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算。

        a==6&&b+=1;     //根据逻辑运算符有短路的特点。所以当a==6不成立时,b+=1根本不会运算,只有a==6成立时,b才能被正确赋值。所以为了避免错误,不要在逻辑运算内进行赋值运算。

        int i = 0 , a = 0 , b = 2 , c = 3 ;

        i = a++ && ++b && c++;  //提示:逻辑运算值为0或者1,后置++只有语句结束后才会+1。

        printf("i=%d\n a=%d\n b=%d\n c=%d\n",i,a,b,c);

条件运算

 ?:条件运算符又被称为三目运算符或者叫三元运算符。

a=(a>3) ? a-2  : a+5;  //?前面的是条件,后面的是条件满足时的值,:后面是条件不满足时的值。相当于if语句

if(a>3)

        a=a-2;

else

        a=a+5;

优先级

条件运算符的优先级高于赋值运算符,但低于其他运算符。

运算顺序是从右往左计算。

 a=3*b>5?5:10        // a*b>5如果成立,则a=5,如果不成立,则a=10.

a<b ? c : d+2         // a<b如果成立,则结果为c,如果不成立,则d+2.

优点是书写更简洁,缺点是增加了嵌套的表达式会非常复杂并不利于阅读。

例如:a=(a>10)?(a<20)?a-2:a-5:(a<5)?a+2:a+5;  //请大家分析一下步骤。

逗号运算符

逗号用来连接两个表达式,并以右边表达式的值作为它的结果。

int a,b,c;

a=(b=2,c=3,b+c);

printf("a=%d,b="%d,c=%d\n",a,b,c);

优先级:

逗号的优先级是所有运算符中最低的,所以它两边的表达式会先计算。

    int a;
    a = 1 + 2, 2 + 3; 
//逗号优先级低于赋值运算符,所以a的值是3.
    printf("%d",a);

逗号运算是从左往右进行的,所以左边的表达式会先计算,而右边的表达式的值会保留下来作为逗号运算的结果。

    int a;
    a = (1 + 2, 2 + 3); 
//逗号右边的值为逗号运算的结果。所以a的值是5.
    printf("%d",a);

逗号运算符的应用。

逗号运算符常常用于把多个表达式连接成一个更大的表达式。

表达式1,表达式2,表达式3....表达式n

在赋值时使用

a=2,b=3,c=4;

for循环中使用

for(a=0,b=5;a<b;a++,b--).....

()运算符

()运算符应用多样可分为一下几类:

类型转换:括号可用于执行强制类型转换,也就是将一个数据类型转换为另一种数据类型。其语法是在括号内指定目标数据类型,然后紧跟要转换的表达式。

函数调用运算符:当 () 紧跟在函数名之后时,它是函数调用运算符,其作用是调用函数并传递参数。在调用时,函数名后的 () 内可以包含多个用逗号分隔的参数,这些参数会被传递给函数用于计算。

表达式分组运算符:用于改变表达式中运算符的优先级,让括号内的表达式优先计算。

优先级

括号运算符在各种运算中的优先级是最高的。这表示括号内的被优先计算。

当表达式中多个()连续出现时,会从左向右依次计算。

语句

c语言的代码是由一条一条的语句构成的,c语言的语句可以分一下五大类。

  • 空语句
  • 表达式语句
  • 函数调用语句
  • 复合语句
  • 控制语句

空语句

---一个分号就是一条语句,这就是空语句。在for语句的判断表达式中常出现空语句。

int main()

{

        ;        //空语句

        return 0;

}

控制语句

判断语句

条件判断语句也叫分支语句:if语句、switch语句;

if语句

---根据比较的结果,决定做、还是不做某些动作,就要用到if语句。

---表达式成立(为真),则语句执行,表达式不成立(为假),则语句执行。

        一个基本的if语句有一个关键字if开头,后面跟上在括号里的一个表达条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果为true,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。

        if(表达式)  //此处没有分号,这不是if语句结束的地方。

                语句;        //if内只有一条执行语句时,可以不用大括号,因为分号可以表示if语句的结束。整个if语句原本写为      if(表达式)  语句 ;

 当if语句内有多条语句时需要加上{}。

        if(表达式){

                语句1;

                语句2;

        }

if.....else.... 

输入一个整数,判断是奇数或偶数。

 int main()

{

        int num=0;

        scanf("%d",&num);

        if(num%2 != 0)        //奇数是不能被 2 整除的整数(被2整除的数为偶数)

                printf(“%d是奇数”,num);

        else                          //当if语句判断输入的值不是奇数,那么就可以else其数值为偶数。

                printf("%d是偶数",num);

        return 0;

}

 if和else后用{}的好处

  • 明确所执行代码块的范围
  • 提高代码块的可维护性与可读性
  • 避免逻辑错误减少bug产生。
  • 提高代码的健壮性与一致性
嵌套if语句 

---在if else 语句中,else可以与另一个if语句连用,构成多重判断。当if的条件满足或者不满足的时候要执行的语句也可以是一条if或者if-else语句,这就是嵌套的if语句。

输入一个整数,判断输入的整数是0,还是正数或者负数。

int main()

{

        int num = 0;

        scanf("%d",&num);

        if(num == 0)

                printf("数值是0");

        else if(num > 0)             //在else中嵌套了if

                printf("数值是正数");

        else

                printf("数值是负数");

        return 0;

}

级联的if-else,是if多重嵌套的一种书写方式。

        输入一个人的年龄,如果年龄小于18岁,打印“少年”

        如果年龄在18至44岁,打印“青年”

        如果年龄在45至59岁,打印“中老年”

        如果年龄在60至89岁,打印“老年”

        如果年龄在90岁以上,打印“老寿星”

正常写法:

int main()

{

        int age = 0;

        scanf("%d",&age);

        if(age<18)          //或者写if(age>0 && age<18)   使用与运算符来圈定范围

                printf("少年\n");

        else

        {

                if (age<45)                  

                        printf("青年\n");

                else

                {

                        if (age<60)

                                printf("中老年\n");

                        else

                        {

                                if (age<90)

                                        printf("老年\n");

                                else 

                                       printf("老寿星\n");

                        }

                }

        }

        return 0;

}

级联的if else写法

int main()

{

        int age = 0;

        scanf("%d",&age);

        if(age<18)

                printf("少年\n");

        else if (age<45)                  

                printf("青年");

        else if (age<60)

                printf("中老年");

        else if (age<90)

                printf("老年");

        else 

                printf("老寿星");

        return 0;

}

增加了嵌套的条件运算符虽然简短但非常不利于阅读与理解,所以不推荐使用嵌套的条件运算。一段好的代码一定是通俗易懂的代码。

例如:age<18?printf("少年"):age<45?printf("青年"):age<60?printf("中老年"):age<90?printf("老年"):printf("老寿星");

switch语句

除了if语句外,c语言还提供了switch语句来实现分支结构。

switch语句是一种特殊的if-else结果,用用于判断条件有多个结果的情况。

书写格式

switch(控制表达式){                //必须是整型表达式。用于控制程序从哪个case开始执行。

case 常量1:    //case后的值必须是常量或者是常量表达式,例1、2、2+5、或定义的常量。

        语句;        //每个case语句中的代码执行完成会继续执行下一个case内的代码。

case 常量2:    //整型包括字符,字符的本质是ASCII码值,这个值是整数

        语句;

        break;    //当case语句中的代码有break关键字时,程序执行到这会跳出switch语句。   

default:    //case与default语句没有顺序要求。当没有任何case满足条件时,那么走default语句。

        语句;        //当default语句不在最后时,要根据实际情况考虑是否添加break。

}                

         整型表达式:是指其运算结果为整型数据类型的表达式。在表达式里可以包含整型常量、整型变量、算术运算符、关系运算符、逻辑运算符等,只要最终的计算结果是整型即可

        整型常量表达式:是指在编译时就能确定其值的整型表达式。它只能包含整型常量、枚举常量、字符常量以及一些编译时就能确定结果的运算符(如算术运算符、逻辑运算符等),不能包含变量,因为变量的值在运行时才会确定。

switch语句的执行流程:

        根据控制表达式的结果来确定从哪个case开始执行程序。若确定case2后,会从case2开始,按顺序执行case2、case3、case4,直到break结束,如果没有break则执行完最后一条case或者default语句结束。

当没有任何case满足条件时,那么走default语句。

输入1~7的数字,打印对应的星期

        int day =0;

        scanf("%d",&day);

        switch(day)

        {

        case 1:

                printf("星期一");

                break;

        case 2:

                printf("星期二");

                break;

        case 3:

                printf("星期三");

                break;

        case 4:

                printf("星期四");

                break;

        case 5:

                printf("星期五");

                break;

        case 6:

                printf("星期六");

                break;

        case 7:

                printf("星期日");

                break;

        default:

                printf("输入错误,请输入1~7的值。");

                break;

        }

输入1~7的数字,打印对应的工作日与休息日

        switch(day)

        {

        case 1:

        case 2:

        case 3:

        case 4:

        case 5:

                printf("工作日");

                break;

        case 6:

        case 7:

                printf("休息日");

                break;

        default:

                printf("输入错误,请输入1~7的值。");

                break;

        }

循环语句

do while语句、while语句、for语句

while循环

while英文可以翻译为当....的时候。在c语言中while循环的意思可以理解为:当条件满足时,不断地重复循环体的语句。

循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行。

while循环的书写格式

while(表达式)            //此处没有分号,因为这不是while循环的结束。

        {                             //循环体有多条语句时,必须用{ }括起来。

                循环体;        //循环体只有一条语句可以不用{ },用分号表示循环体的结束。

        }                             //循环体用{ }括起来,方便阅读,减少出错                                                    

打印1~10的值

        int a=1;

        while(a<=10)                         //循环终止条件a不能大于10.

                pintf("%d\n",a++);          //a++使得a的值最终会达到循环的终止条件。

输入一个正整数,逆序打印整数的每一位,如:输入1234,输出4 3 2 1

        int a=1234;

        scanf("%d\n",&a);

         while(a)

        {

                printf("%d  ",a%10);

                a=a/10;         //两个整数相除得到的还是整数。

        }

do while循环

        do while循环在初次进入循环的时候,先执行一轮循环体代码之后,再来检查循环条件是否满足,如果满足则继续下一轮循环,不满足则结束循环。

do

{

        循环体;  //循环体至少被执行一次

}

while(循环条件); //此处注意要有分号。

输入一个正整数,计算这个整数是几位数? 例如:输入43210 输出5. 

int main() {
    int a = 43210;
    int count = 0;
    do 
        count++;
    while (a = a / 10);   
//可以将赋值作为表达式的判定条件,将a/10赋值给a,再判断a是否为零。
    printf("%d", count);
    return 0;
}    

for循环

for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1.

for(表达式1;表达式2;表达式3)  //表达式之间是分号隔开的。

{

循环体;     //如果只有一条语句可以不用{ },但推荐都使用{ }。

}

表达式1:循环变量初始动作(如果变量已经初始化可以写为空语句)

表达式2:循环是否满足的判断条件   

表达式3:循环变量的调整  //与while循环相比,for循环将为结束循环的表达式从循环体中提出到此

        for循环的执行顺序:先执行表达式1与2,满足条件进入循环体,循环体结束执行表达式3,然后跳过表达式1,直接进行表达式2进行判断,满足条件进入循环体,循环体结束执行表达式3然后再判断,直到条件判断不满足跳出循环。

        

for循环中的每一个表达式都是可以省略的

for(;条件;)==while(条件)

计算1~100之间3的倍数的数字之和

int sum = 0;

for(int a = 1 ;a<=100; a++)//产生1~100的数。c99以上编译器可以在for内初始化变量。

        if(a%3==0)      //判断哪些数是3的倍数

                sum += a ;   //此处分号作为if语句的结束也作为for循环的结束。正规格式要加{ }

printf(“%d”,sum);

也可以将for表达式写为:

for(int a=3;a<=100;a+=3)//直接产生100以内3的倍数的数。循环体内就不需要判断3的倍数了

        sum+=a; 

printf(“%d”,sum);

//这样的算法比上一种算法循环次数更少,而且不需要进行判断,更节省资源。

转向语句

break语句、continue语句、goto语句、return语句

 break和continue语句

        在循环执行的过程中,常常需要提前终止循环。在这种情况系啊,c语言提供了break和continue两个关键字,用于循环中。

当某件事发生后就禁止循环就用break

当某件事发生后就跳过这件事后面的语句就用continue

break语句

只要break语句被执行就会永久终止循环,结束循环语句,跳出循环语句。

while循环遇到break。

int a =0;

while(a<=10)           

{       

        if(a==5)

                break;   //如果a是5的时候break(提前结束了循环)

        a++;                

        printf("%d ",a);  

}

for循环遇到break。
    for(int a = 0;a<=10;a++)      //a<=10为运行循环的条件。那么a>10就是结束条件
    {
        if(a==5)
            break;     
//如果a是5时break(结束循环),a==5成为结束循环的判断条件。 
    printf("%d ",a);        
    }

continue语句

        只要执行continue就会跳过本次循环中continue后边的代码,在for循环和while循环中有所差异。while循环中有可能跳过循环的调整部分造成死循环,而for循环不会。

while循环中的continue:

int a =0;

while(a<=10)           

{       

        if(a==5)

                continue;   //如果a是5时且仅当a是5时跳过了后面的代码。重新进入循环判断。

        a++;                //当a是5时,a++被跳过,程序陷入死循环。需要将a++提到if语句上才行。

        printf("%d ",a);  

}

for循环中的continue:

int a = 0;
    for(a=0;a<10;a++)     
//for循环中continu不会出现跳过a++的条件变量调整的情况。
    {
        if(a==5)
           { continue;} 
  //当a是5时且仅当a是5时,continue语句跳过后面的语句直接返回for的调整
    printf("%d ",a);       
    }

goto语句

---在多重循环嵌套时,特别适合用goto语句跳出循环。goto语句可以实现在同一个函数内跳转到设置好的标号处。

printf("周一");

goto next; //next就是自己设置的标号,设置标号后用分号。名字不能是关键字。

printf("周二");

next:         //跳转的标号后使用冒号。跳过了周二,从周三继续打印。

printf("周三");

end:          //goto从周四后面又跳了回来,陷入了死循环。

printf("周四");

goto end;   //end是自己设置的标号名。

printf("周五");

return语句

----主要用于从函数里返回一个值,同时终止函数的执行。

一个函数里可以有多个return语句,但只要有一个return语句被执行,函数就会立即结束。

return语句返回的值的类型必须和函数定义时的返回类型一致,不然会产生编译错误或者未定义行为。

循环的嵌套

        在解决实际问题中,while、do while、 for三种循环常常嵌套在一起使用。

找出100~200之间的素数,并打印在屏幕上。(素数有称为质数,只能被1和自身整除的数)

for (int a = 100; a <= 200; a++)        //产出100~200间的数  第一层循环
{
    int b = 1;            
//假设a是素数时b为1
    for (int c = 2; c < a; c++)            //产出2~(a-1)之间的数     第二层循环
    {
        if (a % c == 0)         
 //100~200间的数试除2~(a-1)之间的数。
        { 
            b = 0;         
//如果整除说明不是素数,所以将b设为0然后跳出当前循环。
            break;        //break也可以使用goto语句跳转到最外层循环
        }
    }
    if (b)           
//如果b未被设为0则打印a到屏幕上。
        printf("%d  ", a);
}

优化算法:

#include <math.h>          //sqrt()是库函数,开平方。包含在math.h的头文件中

for (int a = 101; a <= 200; a+=2)        //减少了循环次数,偶数除了2都不是素数。
{
    int b = 1;          

    for (int c = 3; c < =sqrt(a); c+=2)            //1.奇数除以偶数的结果必然不是整数,所以没有必要检查偶数。2.因为a如果被整除,肯定有一个因子小于等于a的开平方。这样也可以减少循环次数。
    {
        if (a % c == 0)          

        { 
            b = 0;         

            goto end;           //可以使用goto跳出循环,但只是跳出一层循环完全没必要用goto。
        }
    }

    end:
    if (b)          

        printf("%d  ", a);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值