1.以下程序输出结果是()
int main() {int a = 1, b = 2, c = 2, t;while (a < b < c) {t = a;a = b;b = t;c--;}printf("%d %d %d", a, b, c);
}
解析:a=1 b=2 c=2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1
a<b 不成立 则等于0 然后 0<c 成立 执行循环体 t被赋值为2 a赋值为1 b赋值为2 c-- c变成0
最后输入 1 2 0
2.以下程序输出结果是()
int main() {char a[] = "morming", t;int i, j = 0;for (i = 1; i < 7; i++)if (a[j] < a[i])j = i;t = a[j];a[j] = a[7];a[7] = a[j];puts(a);
}
解析:循环一开始循环时 a[0]<a[1] 成立 j赋值为1 又 a[1]<a[2] j又赋值为2 然后if语句不执行 一直循环到i=7
将a[7] "\0" 和 a[2] 交换位置 最后输出mo
3.以下程序输出结果是()
int main() {char ch[2][5] = { "693","825" }, * p[2];int i, j, s = 0;for (i = 0; i < 2; i++) p[i] = ch[i];for (i = 0; i < 2; i++)for (j = 0; p[i][j] >='0 ' && p[i][j] <= '9'; j += 2)s = 10 * s + p[i][j] - '0';printf("%d", s);}
对于
"693"
:
j = 0
:p[0][0]
是'6',符合条件,s = 10 * 0 + (6 - '0') = 6
j = 2
:p[0][2]
是'3',符合条件,s = 10 * 6 + (3 - '0') = 63
j = 4
: 越界,不再执行。对于
"825"
:
j = 0
:p[1][0]
是'8',符合条件,s = 10 * 63 + (8 - '0') = 638
j = 2
:p[1][2]
是'5',符合条件,s = 10 * 638 + (5 - '0') = 6385
j = 4
: 越界,不再执行。最终,程序输出的是
s
的值,注意s的值一直会保存的输出结果:
该程序的输出结果是
6385
4.以下程序输出结果是()
#define P 3
#define S(a) P*a*a
int main() {int ar;ar = S(3 + 5);printf("%d", ar);
}
5.以下程序输出结果是()
#define N 3
#define Y(n) ((N+1)*n)int main() {int z;z = 2 * (N + Y(5 + 1));printf("%d", z);
}
define 产量首先被替换 N被替换成3 Y(n)==》(3+1)*n)
然后我们看z = 2 * (N + Y(5 + 1)) 是怎么计算的?
N被替换成3 然后 Y(5+1) 是整体把n替换 所以z = 2*(3+(3+1)*5+1)=48 注意括号和乘法是优先计算的
6.以下程序输出结果是()
int main() {
int a = 2, b = -1, c = 2;
if (a < b)
if (b < 0) c = 0;
else c++;
printf("%d", c);}
我们来看一下该代码输出什么? 3? 还是 2?
答案是2,为什么呢。在if分支语句中,但if没有加{ }时,后面只能执行一条语句;else会跟随他最近的if语句(第二个if); 因为a不小于b 则第二个if不执行 else也不执行 输出还是c=2没有变化
7.
#define SQR(X) X*X
main() { int a=16, k=2, m=1;
a/=SQR(k+m)/SQR(k+m);
printf("%d\n”,a); }
先做宏替换,把语句中的SQR(x)替换为x*x,特别注意,简单替换,不添加任何括号,替换后为:
main() { int a=16, k=2, m=1;
a/=k+m*k+m/k+m*k+m;
printf("%d\n”,a); }
现在我们来计算a值语句替换所有变量为数值:
a /= 2+1*2+1/2+1*2+1;
a /= 2+2+0+2+1;
a/=7;
除法之前a值16,而16/7=2,因此执行后a值是2,程序输出结果是2
8.执行以下语句,输出结果是 C 。
int x=2;printf(“%d”, ((x=4*5, x*5), x+20));A) 120 B) 100 C) 40 D) 20
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果(不是一上来看最后一个,前面的表达式要依次左往右计算,再取最后的结果)
解析:先从左往右计算,x被赋值20 ,然后取最后的结果 20+20=40
以下程序的输出结果是( )。
int main() {
char*s="12134211";
int v[4]=0,0,0,0),k,i;
for(k=0;s[k];k++)
switch(s[k]) case’1’:i=0;
case’2’:i=1;
case’3’:i=2;
case’4’:i=3;
v[i]++:
for(k=0;k<4;k++)printf("%d",v[k]);
}
A.4 2 1 1B.0 0 0 8C.4 6 7 8D.8 8 8 8
本题考查switch,case语句,当k=0时,循环体成立,执行switch后表达式的值为’1’,执行case’1’,i的值为0,因为没有break语句,继续执行其后的语句,到最后一个语句时i的值为3,此时v[i]++,v[3]=1,接着执行k++后,k的值为1,当k=1时,循环成立,执行switch后的表达式的值为’2’,执行case’2’,i的值为1,因为没有break语句,继续执行其后的语句,到最后一个语句时,i的值为3,此时v[i]++,v[3]=2,接着执行k++后,k的值为2,依次下去,csse’4’也会执行,最后i的值一定为3,到v[3]=8时循环结束,而v[0]~v[2]的值一直没有变化,故选择B选项
9.
int w = 3;
int main() {
int w = 10;
printf("%d\n", fun(5) * w);
}
fun(int k)
{
if (k == 0)
return w;
return(fun(k - 1) * k);
}
局部变量
w
的作用:
- 在
main
函数中,局部变量w
被定义为10
,遮蔽了全局变量w
(值为3
)。函数
fun
的定义:
fun
函数使用全局变量w
。在函数fun
的内部,变量w
指的是全局变量w
,即3
,而不是main
函数中的局部变量w
。函数
fun
的执行逻辑:
fun(5)
调用会递归地计算fun(4) * 5
,fun(4)
计算fun(3) * 4
,依此类推,直到fun(0)
。fun(0)
返回w
,即3
。因此,递归调用的计算过程是fun(0)
返回3
,然后fun(1)
返回3 * 1 = 3
,fun(2)
返回3 * 2 = 6
,fun(3)
返回6 * 3 = 18
,fun(4)
返回18 * 4 = 72
,fun(5)
返回72 * 5 = 360
。最终的输出:
fun(5)
返回360
,main
函数中计算fun(5) * w
为360 * 10 = 3600
。
int main() {
int x = 023;
printf("%d", --x);
}
023 是八进制 转成 十进制对应是 2*8^1+3*8^0=19 --x 则输出18
10.
int a[3][3] = { {2},{4},{6} };
int main() {
int i, * p = &a[0][0];
for (i = 0; i < 2; i++) {
if (i == 0)
a[i][i + 1] = *p + 1;
else
++p;
printf("%d", *p);
}
}