收藏!关于C语言你绝不知道的黑科技

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语言题目,在他的课上我学到了和其他老师学不到的东西。
持续更新~

发布了47 篇原创文章 · 获赞 102 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/MarcoAsensio/article/details/101030349