1.题1
int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;
请问下列表达式哪些会被编译器禁止?
A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f
我们来分析一下:const用来修饰变量是想其不被改变,也就是所谓的变得静态。但是这个const放在哪?有什么作用也是有讲究的。就比如说int const *c =21,这里的const限制的就是*c,但是没有限制c.那么我们按照这个逻辑推理一下,这个A选项用*c来赋值,但是我们原式的const限制了*c,所以这个A选项是错误的,B选项也是一样的道理。C选项的const限制的是e,但是我们使用的也是e所以也是错误的,D选项的const既限制了*f又限制了f。所以也是错误的。
2.题2
#include <stdio.h>
int i;
void prt()
{
for (i = 5; i < 8; i++)
printf("%c", '*');
printf("\t");
}
int main()
{
for (i = 5; i <= 8; i++)
prt();
return 0;
}
上述代码的运行结果会是什么呢?
A: *** B: *** *** *** *** C: *** *** D: * * *
我们来分析一下:首先大家伙不会觉得是B选项呢?当然B选项坑定是错的,大家之所以会去选B应该是觉得main函数中for循环4次,共调用4次prt函数,所以选B但是大家可能没有看到这串代码的第一行是int i;这个代码说明什么呢?其实它是在告诉我们i是一个全局变量。当我们在第一次调用prt的时候,i在其函数中变为9后跳出,但是它出函数的时候,变量i并没有销毁,而是继续为9,再次回到main函数,发现判断式为假,跳出循环,所以只调用一次prt函数,应该选A。
到底是不是呢?我们运行看看:
3.题3
int main()
{
int a=3;
printf("%d\n",(a+=a-=a*a));
return 0;
}
这串代码的运行结果是什么呢?
这一题我们需要考虑运算符的优先级。这里的+=其实就是我们的a+=1等价于a=a+1,所以这里的式子就等价于a=a+(a=a-a*a),这样的话我们就先计算括号里面的式子,a=a+a=-6;所以结果为-12。
我们运行看看:
4.题4
int main()
{
int m=65;
int n=14;
printf("Enter m,n;");
while (m!=n)
{
while(m>n) m=m-n;
while(n>m) n=n-m;
}
printf("m=%d\n",m);
return 0;
}
我们来分析一下:其实这题比较简单大家只需要认真计算即可,我们只需要注意随着判断式的改变静茹的循环不一样,进行的式子也会不同,但是不要忘记了验算一下。
运行看看:
5.题5(首先输入要输入的整数个数 n ,然后输入 n 个整数。输出为 n 个整数中负数的个数,和所有正整数的平均值,
结果保留一位小数。)
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
int main()
{
int n, contu1 = 0;
int contu2 = 0;
float sum = 0;
scanf("%d ", &n);
int* pt = (int*)malloc(n * sizeof(int));
assert(pt);
for (int i = 0; i < n; i++)
{
scanf("%d", &pt[i]);
}
for (int i = 0; i < n; i++)
{
if (*pt < 0)
{
contu1++;
}
else if (*pt > 0)
{
sum += *pt;
contu2++;
}
pt++;
}
printf("%d %.1f", contu1,sum/contu2);
free(pt);
pt = NULL;
return 0;
}
大家可以动手尝试一下,当然这不是唯一的结果。也期待收到大家的私信,和我交流一下。