1.不使用循环、控制语句和公式实现从1加到100
#include <stdio.h>
#include <stdlib.h>
int sum(int n){
int ans = 0;
n && (ans = sum(n - 1) + n);
return ans;
}
int main(){
printf("%d\n", sum(100));
return 0;
}
我第一次见到这道题是大一的时候,团队一个大三学长出的,我读完题之后,马上没有的思考的说出不用循环那就用递归嘛,学长说,递归可以,但是你怎么控制递归的退出条件,我一时哑口无言,后来他给我们写了上述代码。大家都学过位运算,&是按位与运算的意思,但鲜为人知的是&&,大家见到这个运算符的第一反应是逻辑与运算符,没错,不过它还有另外一个名字——短路运算符,因为&&只有在前后都为真的情况下才为真,因此,当前面为假的时候,后面便不再执行,用在这个题上,当n == 0时,递归结束,算出100+99+…+1的值。
2.口算下列程序的输出结果
#include <stdio.h>
#include <stdlib.h>
int main(){
int j, c;
c = 0;
static char num[2][9] = {"17208980", "28219198"};
for (j = 7; j >= 0; j--){
c += num[0][j] + num[1][j] - 2*'0';
printf("%d\n", c);
num[0][j] = c%10 + '0';
c = c / 10;
}
printf("%s\n", num[0]);
return 0;
}
这个题是软考的一道题,用编译器直接跑当然可以跑出结果,但题目要求口算,如果你没有发现规律,而一步一步算的话,不仅浪费时间,还特别容易出错,仔细看,这道题是有规律的。c += num[0][j] + num[1][j] - 2*'0';
这条语句如果我们把它拆分成c += num[0][j] - '0' + num[1][j] - '0';
,就显而易见了,就是把字符串变成它对应的十进制数,然后相加嘛,配合上num[0][j] = c%10 + '0';
和c = c / 10;
把个位留下,十位保存起来,没错,把上下两个字符串相加便是最后的结果。
3.gcc和vc编译器的差异
#include <stdio.h>
#include <stdlib.h>
int main(){
int i;
i = 1;
printf("%d %d %d %d %d %d\n", i++, ++i, i, i--, --i, i+6);
printf("%d\n", i);
return 0;
}
gcc编译器的运行结果
vc编译器的运行结果
4.#include <filename.h>
和#include "filename.h"
有什么不同
对于#include <filename.h>
,编译器从标准库路径开始搜索filename.h
对于#include "filename.h"
,编译器从用户的工作路径开始搜索filename.h
5.指针变量的大小
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[] = "hello";
char *p1 = "world";
void *p2 = malloc(100);
printf("%d\n%d\n%d\n", sizeof(str), sizeof(p1), sizeof(p2));
return 0;
}
在32位操作系统下,gcc编译器程序依次输出6,4,4。
因为编译器会在字符串的末尾添加’\0’。
而在32位操作系统下,指针变量是4个字节的。
6.判断以下程序的输出结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getMemory(char *p){
p = malloc(100);
}
int main(){
int str = NULL;
getMemory(str);
strcpy(str, "hello world");
printf("%s\n", str);
return 0;
}
这个程序虽然不会报错,但它是没有输出结果的,这就牵扯到函数调用的问题,我用我粗鄙的知识稍微解释一下,程序执行到getMemory(str)的时候,会为这个函数在栈中开辟一块空间,函数的形参,局部变量都存储在这块内存中,当函数调用结束的时候,这块内存就会被释放,因此并没有改变str的值。
以上这些大部分是在学校开设的计算机科学基础课上学到的,说到这,就必须大赞一下廖老师了,廖老师算是卓越班的开山鼻祖,虽然现在不带卓越班了,但一直关注着卓越班,他为我们精心准备了这些我们容易忽视的C语言题目,在他的课上我学到了和其他老师学不到的东西。
持续更新~