首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言——小学一年级题目解析(二)

这是奔跑的键盘侠的第141篇文章

作者|我是奔跑的键盘侠

来源|奔跑的键盘侠(ID:runningkeyboardhero)

转载请联系授权(微信ID:ctwott)

搬砖继续……

第5题

上一期有提过if,else后面跟大括号的问题{},如果没有大括号,只执行第一句。

if成立的话,执行a=3,判断语句结束。也就是既要执行a=3,也要执行b=3。

if不成立的话,跳过a=3,判断结束。也就是只执行b=3。

显然,2>1,if不成立, 只执行b=3。输出结果a为首次赋值的2,b为第二次赋值3。

至于缩进,虽然if后面两行都有缩进,但并起不到大括号的作用。所以if,else语句务必要养成默认使用大括号的习惯,以减少不必要的麻烦。

代码语言:javascript
复制
#include "stdio.h"
int main()
{
int a=2,b=1;
if(a<b) 
a=3;
b=3;
printf("%d,%d",a,b);
}
C:\Users\Desktop\2019_943_10.c: In function 'main':
C:\Users\Desktop\2019_943_10.c:5:2: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  if(a<b)
  ^~
C:\Users\Desktop\2019_943_10.c:7:3: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if'
   b=3;
==========编译成功后开始运行==========
"C:\Users\Desktop\2019_943_10.exe"
Process started (PID=20680) >>>
2,3<<< Process finished (PID=20680). (Exit code 0)

================ READY ================

注意,按照题目里的缩进格式coding,虽可以编译成功,但是会有一个warning(红字部分)。

当然,如果把b=3的缩进取消(跟if对齐),编译错误就自动消失了。运行结果不变。

第6题

关于循环中的for, do...while,while, 应用有这么一个优先顺序:确定循环次数的,优先用for循环;至少要执行一次的,用do……while;其他场景再优先考虑while。

这个题目考察的是do...while的运行次序。do在前的,循环至少进行一次,然后才是while判断。

故直接输出x=x-2的值,1。接着,while判断(!0),非零为真,会再来一次do循环,而经过while的判断x=0了。

第二轮do,输出x=x-2的值,-2。while判断(!(-3)),负数为假,非负数为真,继续do循环,此时x=-3。

至此,可以发现while中的--x,每一轮会减少3。从0,-3,-6,-9……往下递减,while会一直成立。

死循环。

============

测试了一下代码,发现并没有死循环

而是输出了1 和-2,结束。

作为一名业余小白,情有可原吧,基础有待加强。网上科普了一下,关于数值的逻辑值,有这么一句话“非0即真”,也就是说只有0为False,其他数值都是True,然后!要再取个反。

额,慢慢消化一下。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
int x=3;
do{
printf("%d\n",x-=2);
}while(!(--x));
return 0;
}
==========编译成功后开始运行==========
"C:\Users\wangchao\Desktop\ky\c_exam_test\2019_943_11.exe"
Process started (PID=4628) >>>
1
-2
<<< Process finished (PID=4628). (Exit code 0)

================ READY ================

第7题

do在前的,循环至少进行一次。

第一轮:x=1 while,非0即真:1为真,!1假,循环结束。

代码语言:javascript
复制
只循环一次。

#include <stdio.h>
int main()
{
int x=-1;
do{
x = x*x;
printf("%d",x);
}while(!x);
}
==========编译成功后开始运行==========
"C:\Users\wangchao\Desktop\ky\c_exam_test\2019_943_12.exe"
Process started (PID=10020) >>>
1<<< Process finished (PID=10020). (Exit code 0)

================ READY ================

第8题

这个一个概念理解的题目,关于数组的初始化。其实还没学到这一章节,简单翻了一下网上介绍,硬着头皮来讲一下吧。如果有谬误,请大家批评指正。

从一维数组说起,定义一维数组时可以指定数组长度:如果元素值只写了一半(至少要写一个值),后面一半默认为0。

如果不指定数组长度,那定义时大括号中元素值的个数就是数组的长度,说白了,还是变相的定义了数组的长度(让计算机自己去数定义了几个元素,这样也挺好的,不需要我们自己去数数再填写,更不会出错)。

总之,一维数组在定义的时候,就决定了数组的长度。

接着,说二维数组,关于第一维可以省略、第二维不可省略,我是这样理解的:

一个常见的场景,比如计算机等级考试报名信息统计表,有几个字段(姓名,性别,学号,考试科目)等等都是预设好的可以非常迅速的人工数出来(这个对应的是二维的长度,也就是列),等学生报名完,要统计报名情况。有多少人报名了??这个就是未知数了(对应的一维的长度,也就是有多少行,未知)。

在我们录excel表的时候,逐行录入,录到最后一张报名表,才知道总共有多少个人报名了(对应多少行,也就是一维的长度)。

大概就是这么个道理吧。

关于这道题目,首先可以排除A,二维长度不可省略;

然后C,2行4列,结果搞成了3行,错误;

关于B,D。乍一看没毛病,仔细看,才发现,D少了一个逗号;

选B。

可能有同学有疑问,D如果加上逗号,对不对?测试一看便知:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
int i=0;
int j=0;
int a[][3]={{1,0,1},{},{1,1}};
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
==========编译成功后开始运行==========
"C:\Users\wangchao\Desktop\ky\c_exam_test\2019_943_13.exe"
Process started (PID=14860) >>>
1 0 1 
0 0 0 
1 1 0 
<<< Process finished (PID=14860). (Exit code 0)

================ READY ================

D如果加上逗号,就没毛病了。

下一篇
举报
领券