如何备考C语言二级考试之程序运行结果分析篇
在C语言二级考试中,给出C语言小程序,让考生分析运行结果的题目比较多,相对来说这方面的题目比较简单,只要细心推导,得出结果不难。下面就由电仔谈谈这方面的解题经验,主要是把我解题的过程写出来,而不是讲解理论。
程序:
#include
int main(int argc,char **argv)
{
int x=10,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf(“%d %d\n”,x,y);
return 0;
}
分析程序运行结果为?
电仔的解题步骤:
把 if(x==y)t=x;x=y;y=t; 语句这样书写
if(x==y)
t=x;
x=y;
y=t;
或者干脆这样书写
if(x==y)
{
t=x;
}
x=y;
y=t;
可以看出 x==y 为假, t=x; 语句不执行
x=y,也就是x=20,t不变,也就是t=0
那么 printf(“%d %d\n”,x,y ); 语句打印输出
20 0
图为在Linux系统下编程验证,图中黑色部分为程序输出结果
程序:
#include
main()
{
int i,n={0};
for(i=1;i<=4;i++);
{
n[i]=n[i-1]*2+1; printf("%d",n[i])
}
printf("\n");
}
则程序输出结果是?
电仔的解题步骤:
for(;1<4;i++);
{
n=n*2+1; printf("%d",n);
}
上面是第一次循环,n=0*2+1=1,则 printf("%d",n[i]); 输出1
for(;2<4;i++);
{
n=n*2+1; printf("%d",n);
}
上面是第二次循环,n=n*2+1=3,则 printf("%d",n[i]); 输出3
for(;3<4;i++);
{
n=n*2+1; printf("%d",n);
}
上面是第三次循环,n=n*2+1=3,则 printf("%d",n[i]); 输出7
for(;4==4;i++);
{
n==n*2+1; printf("%d",n);
}
上面是第四次循环,n=n*2+1=3,则 printf("%d",n[i]); 输出15
结束循环后执行 printf("\n"); 输出换行
最后我们可以看到的输出为
13715
图为在Linux系统下编程验证,图中黑色部分为程序输出结果
程序:
#include
main()
{
char c1,c2;
scanf(“%d”,(int *)&c1);
c2=c1+9;
printf(“%c%c\n”,c1,c2);
}
字符0的ASCII码值为48,若程序运行时从键盘输入48后回车,则输出结果为?
电仔的解题步骤:
执行完 scanf(“%d”,(int *)&c1); 后,c1的值为48,对应的ASCII码为字符0
执行完 c2=c1+9; 后,c2的值为57,对应的ASCII码为字符9(0+9)
那么执行 printf(“%c%c\n”,c1,c2); 输出
09
图为在Linux系统下编程验证,图中黑色部分为程序输出结果
程序:
#include
main( )
{
int a=1, b=0;
if( !a ) b++;
else if( 0==a) if(a) b+=2;
else b+=3;
printf( "%d\n",b );
}
程序运行的输出结果是?
电仔的解题步骤:
为了方便理解,我把主函数整理为等效的布局和表达形式
main( )
{
int a=1, b=0;
if( !a )
{
b++;
}
else if( a==0)
{
if(a)
{
b=b+2;
}
else
{
b=b+3;
}
}
printf( "%d\n",b );
}
这样就容易看出, !a 为假, a==0 也为假,所有条件语句括号内的语句都得不到执行,变量b的值不变所有 printf( "%d\n",b ); 输出
0
对这题还不能理解的读者欢迎在评论中提出,图为在Linux系统下编程验证,图中黑色部分为程序输出结果
程序:
#include
main( )
{
int a=1, b=2;
while( a<6 ) { b+=a; a+=2; b%=10; }
printf( "%d, %d\n",a, b );
}
则程序的运行结果是?
电仔的解题步骤:
同理,我也把main函数整理一下
main( )
{
int a=1, b=2;
while( a<6 ) { b=b+a; a=a+2; b=b%10; }
printf( "%d, %d\n",a, b );
}
接着推导while循环何时结束
while( 1<6 ) { b=2+1; a=1+2; b=3%10; }
上面是第一循环,最后 b=3 ,a=3
while( 3<6 ) { b=3+3; a=3+2; b=6%10; }
上面是第一循环,最后 b=6 ,a=5
while( 5<6 ) { b=6+5; a=5+2; b=11%10; }
上面是第一循环,最后 b=1,a=7
while( 1<6 )
条件不成立,循环结束执行 printf( "%d, %d\n",a, b ); 输出
7, 1
图为在Linux系统下编程验证,图中黑色部分为程序输出结果
程序:
#include
main( )
{
char s[ ]="rstuv";
printf( "%c\n",*s+2 );
}
电仔的解题步骤:
这题牵涉到指针数组,有时间我再写个指针数组的专题
*s+2 等效为 (*s)+2
也就是 'r'+2 ,换句话说取出字符ASCII的码值加2,刚好是 t 的码值
输出和"rstuv"的‘t’没有一点关系, *s+2 要是理解为 *(s+2) 输出也是 t
但是这样理解是错的,比如把对应该语句改为 char s[ ]="rsuuv";
那么输出结果是 t 而不是u
图为在Linux系统下编程验证,图中黑色部分为程序输出结果
版权声明:本站【趣百科】文章素材来源于网络或者用户投稿,未经许可不得用于商用,如转载保留本文链接:https://www.qubaik.com/life/87099.html