前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

五道选择题:

1、请阅读以下程序,其运行结果是( )

#includeint main(){char c='A';if('0'<=c<='9') printf("YES");//1else printf("NO");return 0;} 

A、YES B、NO C、YESNO D、语句错误

解析:易错题,很多人看到代码1的时候就会下意识的认为,它的判定条件是变量c大于等于字符0且小于等于字符9才打印YES,实际上要实现这样的功能代码得是’0′<=c&&c<='9'

代码1的执行是先进行’0′<=c这个运算,再把运算所得到的值与'9'进行比较,c存放的是字符变量'A',ASCII码值为65,'0'的ASCII码值为48。所以'0'<=c得到的值是1,再与'9'进行比较,显然1<='9',最终表达式为真,执行YES的打印。故选A

2、下列程序的输出结果是什么( )

#includeint main(){int n = 1001;int ans = 0;for(int i = 1; i <= n; ++i){ans ^= i % 3;//1}printf("%d",ans);return 0;}

A、-2B、0C 、1D、2

解析:^(异或)运算符的计算规则是将两个数相同的位变为0,不同的位变为1,那么两个相同的数^等于0,^运算符还满足交换律,因此在进行^的时候可以任意地交换数字之间的位置。

观察代码发现,目标是打印出ans的值,ans在最开始的时侯被赋值为0,然后进入for循环,走向代码1,不停地^i%3的值。i%3可以看出,会在0,1,2三个数中循环,而循环的开始i是为1,所以循环是1,2,0,那么ans就在不停地^1,2,0。观察可知循环的次数为1001,1001/3=333余2。而第332次1,2,0的时候是偶数,意味着第332次时,1,2,0都是一对一对的,那么全部都会被^为0,故最后的结果为(0^1^2)^1^2,等于0,所以选B

3、下面有关空指针和未初始化指针,说法错误的是( )
A、对0x0这个地址取值是非法的
B、空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方
C、空指针与任何对象或函数的指针值都不相等D、malloc在其内存分配失败时返回的是一个未初始化的指针

解析:不能对空指针进行解引用操作,A正确。空指针是没有指先任何空间的指针,未初始化的指针是野指针,是不安全的可能指向任何地方,B正确。空指针没指向任何空间,没有值,故C正确。malloc创建失败的话会返回空指针,故D错误。选D

4、有以下函数,该函数的功能是( )

int fun(char *s){char *t = s;while(*t++);//1return(t-s);//2}

A、比较两个字符的大小B、计算s所指字符串占用内存字节的个数
C、计算s所指字符串的长度 D、将s所指字符串复制到字符串t中

解析:易错题,遇到这种题最好的方法就是传一个东西进去试一下,我们传字符串”abc”进去,可以看出,函数fun先使用字符指针t存放s的指针,所以此时t可以等效为”abc”的首地址,走到代码1,是一个循环,循环会令t不停地走直到走到’\0’,因为’\0’的ASCII码值为0。而字符串”abc”走三次才会走到’\0’。但是要注意,*t++,也就是会走到’\0’之后的一个位置。最后走到代码2,首地址和后面的一个地址一减,就会得到字符串”abc”的长度再+1=4。综上所述,答案选B,计算的是字符串占用内存字节的个数,包含’\0′

5、若有float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; 则 *pa 的值是()

A、1.5 B、2.5 C、3.5 D、4.5

解析:从左往右一步步看,首先定义了一个浮点型数组a,存放了1.5,2.5,3.5。接着,使用浮点型指针将浮点型数组a的首地址赋给pa,那么pa现在存放的值为1.5,最后*(pa++)*=3,先使用后++,根据优先级,解引用得到1.5*=3,那么数组a首地址所指向的值被修改为4.5。然后pa++,来到2.5所在的地址,*pa解引用,故最后得到的值为2.5,选B

编程题1:

统计每个月兔子的总数_牛客题霸_牛客网统计每个月兔子的总数_牛客题霸_牛客网

思路:通过一些计算你可以发现,第n个月的兔子总数就是第n个斐波那契数,接下来就很简单了。

#include int main(){int a=1;int b=1;int month=0;scanf("%d",&month);if(month<3)//当要计算的斐波那契数<3直接打印1{printf("%d",a);return 0;}while(month-2){int tmp=a;a=b;b=tmp+b;month--;}printf("%d",b);}

编程题2:

最大公约数__牛客网 (nowcoder.com)

思路:使用辗转相除法解决问题,具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

#include int main() {long long int a = 0; long long int b = 0;//使用long long,防止数据过大scanf("%lld %lld", &a, &b);while (b){long long int tmp = b;//储存中间变量b = a % b;a = tmp;}printf("%lld", a);return 0;}

好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O