草庐IT

【C语言每日亿题】运算符专练 · 第4日

kikokingzz 2024-12-12 原文

🌕写在前面


Hello🤗大家好啊,我是kikokingzz,名字太长不好记,大家可以叫我kiko哦~

从今天开始,我将正式开启一个新的打卡专题——《C语言百炼成神计划》,没错!百炼成神,目的是通过百天刷题计划,通过题目和知识点串联的方式,完成C语言的复习和巩固;后期还会配有专门的笔记总结和文档教程哦!想要搞定,搞透C语言的同学

🎉🎉欢迎持续关注🎉🎉

🍊博客主页:kikoking的江湖背景🍊


🌟🌟往期必看🌟🌟

🔥【C语言百炼成神】第一日·操作符🔥

🔥【C语言百炼成神】第二日·操作符🔥

🔥【C语言百炼成神】第三日·操作符🔥

ps:文章若有任何疑问欢迎光速评论私信我!!有时kiko可能会打错,脑子瓦特了😵‍💫

目录

🌕写在前面

📜上期作业 ⭐️⭐️⭐️⭐️⭐️

🍹解题步骤

🍺011.题目难度 ⭐️⭐️⭐️

🍯本题考点:关系运算符

🥃解题思路:手术刀解剖法

🍹知识点12:关系运算符

🍹解题步骤

🍺012.题目难度 ⭐️⭐️⭐️

🍯本题考点:逻辑运算符与关系运算符

🥃解题思路:仔细执行法

🍹知识点13:逻辑运算符

🍹知识点9:位运算符

🍹解题步骤

📜今日作业 ⭐️⭐️⭐️

📜上期作业 ⭐️⭐️⭐️⭐️⭐️

下面代码的结果是:( )

#include <stdio.h>
int main()
{
	int a, b, c;
	a = 5;
	c = ++a;
	b = ++c, c++, ++a, a++;
	b += a++ + c;
	printf("a = %d b = %d c = %d\n:", a, b, c);
	return 0;
}

A.a = 8 b = 23 c = 8
B.a = 9 b = 23 c = 8
C.a = 9 b = 25 c = 8
D.a = 9 b = 24 c = 8

kiko:经过这么多天的训练 ,想必这道题你肯定能拿下吧

小明:那当然,手术刀解剖法我已经熟记于心了,kiko老师,我给你解剖一下这题

kiko:先把题从头到尾看一遍,分析一下出题人想考的一些重点有哪些~

小明:这题的重点分别是:运算符的优先级、结合性、逗号运算符、复合赋值运算符

kiko:不错,那么具体解法是什么呢?

🍹解题步骤


前置++:先加1,后使用,即先使用变量中内容,然后给结果加1

后置++:先使用变量中内容,整个表达式结束时,给变量加1

逗号表达式:取最后一个表达式的值作为逗号表达式运算的结果


 step1.将常量5赋值给变量a

a = 5;

a==5


step2. 先对a++,a变为6;再将计算后的a赋值给c,此时c=6

c = ++a; 

a==6 ; c==6 


step3.由于逗号运算符的性质,此时优先级从高到低顺序是:++  、 =

①先计算 ++c,得到c=7,然后由于 = 的优先级高于",",因此先将++c的值赋值给b,b变为7

②此时 b = ++c 和后边的 c++ ++aa++构成逗号表达式,从左向右依次计算        

c++使 c变为8 ;++aa++ 使a最后变为 8

b = ++c, c++, ++a, a++;

a==8 ; b==7 ; c==8 


step4.优先级从高到低顺序是:++  、 + 、 +=

①因此先计算a++,再计算加法,由于此处是后置++,先使用a再对a++,因此先进行a+c的加法运算,此时a+c的值为16。

②进行复合赋值的运算:该值通过复合赋值给b,即b=b+16=7+16=23

③此时a的值使用完毕,最后对a+1,a的值变为9。

b += a++ + c;

a==9 ; b==23 ; c==8 

正确答案: B

🍺011.题目难度 ⭐️⭐️⭐️

011.对于下面这段代码,a、b、c的输出值分别为()

    int a,b,c;
    a=b=c=10;
    a=b==c;
    printf("a=%d b=%d c=%d\n",a,b,c);
    a=b>c>=100;
    printf("a=%d b=%d c=%d\n",a,b,c);

🍯本题考点:关系运算符

🥃解题思路:手术刀解剖法

小明:终于看到一道没见过的考点了,关系运算符是啥呀?

kiko:关系运算符就是我们平时所说的比较大小的运算

小明:那就是 大于、小于、等于 这些运算?

kiko:没错!关系运算符满打满算一共只有6种

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

小明:那这有什么好学的呢?

kiko:我们主要谈谈以下两个方面: 

🍹知识点12:关系运算符


🥝关系运算符

C语言提供了6种关系运算符,它们分别是:== 、!=、 >、 >=、 <、 <= 他们都是双目运算符,需要有2个操作数,是左结合的(自左向右运算)。

🥝关系表达式

用关系运算符将两个C语言表达式连接起来的式子称为关系表达式。关系表达式的结果只有1和0:关系表达式成立时为1,不成立时为0。

例如:若a=1,b=2,c=3;(ps:算术运算符优先级高于关系运算符)

1.a+b>c 表达式不成立,表达式的值为0

2.a+b==c 表达式成立,表达式的值为1

🍅1.关系运算符的比较规则

·使用关系运算符时,返回值只能为1或0。若判断条件为真则返回1,否则返回0。

  1. 比较两个数字时,按照数学法则比较大小并判断真假
  2. 比较两个字符时,则比较字符的ASCLL码的值
  3. 比较两字符串时,则首先比较首字符的大小关系,若不等则将首字符大小关系作为字符串的大小关系,否则比较下一个字符,直到得出大小关系
  4. 比较两个表达式的大小,则系统会先计算处两个表达式的值,之后按照上述规则比较表达式的值并判断真假,返回1或0
  5. 比较两个不同数据类型的数据的大小时,先根据一定的规则统一数据类型,之后按上述规则比较并得出返回值。

🍅2.关系运算符的易错点

 注:在编程的过程中== 和=不小心写错,可能会导致出错

🍹解题步骤


011.对于下面这段代码,a、b、c的输出值分别为()

    int a,b,c;
    a=b=c=10;
    a=b==c;
    printf("a=%d b=%d c=%d\n",a,b,c);
    a=b>c>=100;
    printf("a=%d b=%d c=%d\n",a,b,c);

step1.由于赋值运算符是右结合的性质,因此10最先赋值给c,然后将c赋值给b,最后将b赋值给a,使得a、b、c均赋值为10

    int a,b,c;
    a=b=c=10;
实质:a=(b=(c=10))

step2.由于运算符的结合性:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

因此先进行关系运算,即b==c,然后再进行赋值运算:

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

由于b、c均在前面步骤中赋值为10,因此b==c,关系表达式成立,关系表达式值为1,然后将表达式的值赋值给a,因此a的值最后为1;但b、c的值没有发生变化,还都是10。

输出:a=1 b=10 c=10;

step3.由于运算符的结合性:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

先进行关系运算,即b>c>=100,由于此时优先级相同,依靠其结合性进行运算:自左向右运算,b>c 不成立,关系表达式的值为0;然后比较 (b>c)>=100,即 0>=100 不成立,关系表达式的值为0;最后将0赋值给a,a的值为0;但b、c的值依旧没有发生变化,都是10

     a=b>c>=100;
实质:a=((b>c)>=100);
    printf("a=%d b=%d c=%d\n",a,b,c);

输出:a=0 b=10 c=10;

 正确答案:

🍺012.题目难度 ⭐️⭐️⭐️

012.试判断给定的某年year是否是闰年。
闰年的条件是符合后面两个条件之一:能被4整除,但不能被100整除;能被400整除

🍯本题考点:逻辑运算符与关系运算符

🥃解题思路:仔细执行法

小明:这题好简单,我之前就写过,kiko佬,你不会没东西讲了叭?

kiko:你觉得我既然决定要讲这题,难道会和其他人讲的一样吗?你先看看这题的考点!

小明:终于看到没见过的考点了!逻辑运算符,这个我知道,就是和位运算符长的很像的那个!

kiko:长的确实挺像,那你能说说他们之间的区别是什么吗?

小明:emmmm,那好像有点难说清楚😅

🍹知识点13:逻辑运算符


 Q1:什么是逻辑运算?

A1:逻辑运算又称布尔运算,通常是用来测试真假值,“真”即事件“成立”,“假”即事件“不成立”,判断的结果只有两种情况。在C语言中用数字“1”和“0”表示真假两种状态,称这两个值 为“逻辑值”。

Q2:什么是逻辑运算符?

逻辑运算符包括逻辑非(!),逻辑与(&&)和逻辑或(||),其中! 是一元运算符,&&||为二元运算符。

符号含义
!逻辑非:代表逻辑取反,即:把非0的数值变为0,把0变为1;
&&逻辑与:所有操作数都真才真
||逻辑或:满足操作数中有一个为真就真
#include <stdio.h> 
int main() { 
    int a = 1&&0;//逻辑与,操作数全真才真,这里&&的右操作数0为假,所以为假——>0
    int b = 1&&9;//逻辑与,&&的操作数都为真,因此为真——>1
    int c = 1||0;//逻辑或,操作数有一个真就为真,这里||的左操作数为真,所以为真——>1
    int d = 0||0;//逻辑或,||的操作数都为假,因此为假——>0

    printf("%d\n",a); // 0
    printf("%d\n",b); // 1 
    printf("%d\n",c); // 1
    printf("%d\n",d); // 0

    int a = 10;
    printf("%d\n",!0);//输出1->逻辑反运算,把0变成1
    printf("%d\n",!a);//输出0->逻辑反运算,非0数值转化为0
}

kiko:这边再给你回顾一下我们第三日才刚刚讲过的知识点: 【C语言百炼成神】第三日·操作符

🍹知识点9:位运算符


从运算符的名字来看,不难看出位运算符是对二进制位进行运算:

  • 按位与 & :  同1为1;有0则0
  • 按位或 |:     有1为1;同0则0
  • 按位异或 ^:相异为1;相同为0
  • 注: 他们的操作数必须是整数
int main()
{
	int a = 3;//             00000000 00000000 00000000 00000011 —3的补码
	int b = -5;//            11111111 11111111 11111111 11111011  -5的补码
 
	int c = a & b;//按位与   00000000 00000000 00000000 00000011  == 3
	int d = a | b;//按位或   11111111 11111111 11111111 11111011  ==-5
	int e = a ^ b;//按位异或 11111111 11111111 11111111 11111000  ==-8
 
	printf("%d\n", c);// 3
	printf("%d\n", d);// -5
	printf("%d\n", e);// -8
 
	return 0;
}

小明:我发现了,位运算其实就是从微观的角度进行运算,对每一个二进制位进行运算,而逻辑运算那就是从宏观角度,对一串二进制位所组成的数进行逻辑运算

kiko:分析的不错,确实有这么一点意思

🍹解题步骤


step1.通过题目我们知道,只要满足两种条件之一,就可以判定为闰年;用计算机的语言来说就是:(条件1) || (条件2) ,满足其中一个为真,即可判定为闰年:

    if(( 条件1)||(条件2) )
    printf("是闰年\n");
    else
    printf("不是闰年\n");

step2.写出了大框架后,我们发现其中一个条件要求:能被4整除并且不能被100整除,这句话中隐藏了一个“并且”的逻辑关系;用计算机的语言来说: (能被4整除) && (不能被100整除),这两点必须同时满足,其中一个为假,就🙅不可判定为闰年。

    if( (能被4整除) && (不能被100整除) || (能被400整除))
    if((year%4==0)&&(year%100!=0)||(year%400==0))

step3.综上所述,我们将step1与step2相结合,就是最终答案。

正确答案:


#include <stdio.h> 
int main() { 
    int year;
    printf("请输入年份:");
    scanf("%d",&year);
    if(year%4==0&&year%100!=0||year%400==0)
        printf("是闰年\n");
    else
        printf("不是闰年\n");
}

Q1:为什么 if(year%4==0&&year%100!=0||year%400==0) 里面的判断条件可以不打括号?

A1:因为这是由于运算符的优先级 :

! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

因此,由于优先级,运算顺序是确定的,不需要使用括号来提部分运算的优先级。

📜今日作业 ⭐️⭐️⭐️

要判断变量a的值是否为0~5,请问下列表达式哪一个正确?为什么?

(1) if(0<a<5)

(2) if(0<a && a<5)

kiko:每天都要通过作业来巩固自己的学习水平哦!!

小明:这题好简单的感觉~😄

kiko:当然啦,你都学完逻辑运算符关系运算符这两个知识点了,这题只是简单考察而已~

小明:答案在哪里啊,我看看🤩

kiko:下一期再告诉你啦!

有关【C语言每日亿题】运算符专练 · 第4日的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  6. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  7. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  8. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  9. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  10. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

随机推荐