两个超级有意思的C语言题目,很多人都一脸懵逼!

时间:2022-07-22
本文章向大家介绍两个超级有意思的C语言题目,很多人都一脸懵逼!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、关于编译期的sizeof

废话少说,直接上代码。

#include<stdio.h>
main()
{
    int i = 5;
    int j = 5;
    sizeof(++i);
    sizeof(j++);
    printf("i: %d     j: %dn",i,j);
    return 0;
}

已知i=5,执行sizeof(++i)之后,i的值是多少?

这个问题虽然比较不起眼,但是比较细节。

sizeof() 是一个编译期间预处理就决定结果的操作,学过编译原理的朋友都知道,程序编译期间肯定不会动态执行语句,所以无论i++ 还是++i,都不会执行。程序运行时,sizeof() 函数的结果已经被静态编码进程序了,所以取出的数值就是 i = 5 的数值。

一句话总结,sizeof()中的语句永远不会被执行。所以以上的代码就相当于:

#include<stdio.h>
main()
{
    int i = 5;
    int j = 5;
    printf("i: %d     j: %dn",i,j);
    return 0;
}

答案见文末。

2、关于结构体的对齐属性

请问以下代码的输出是什么呢?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data{
     char a;
     int b;
};
int main()
{
    char* mem = (char*)calloc(1, 100);  //初始化两个void*指针
    struct data *dt;
    memset(mem, 'c', 1);
    memset(mem+1, 2, 1);
    memset(mem+2, 0, 99);

    dt = (struct data*)mem;
    printf("%c %d ", dt->a, dt->b);
    return 0;
}

很多人用这种方法给数据进行转换,想当然会认为认为dt->a 就是 'c', b在小端序机器上就是2,大端序机器上就是 0x02000000。

恩,还不错,知道大端序、小端序,但是答案还是错的。

struct dt 的size是8 byte (4 byte + 4byte),并不是 1 byte(char a) +4 byte (int b) = 5 byte, 因为结构体默认被对齐了,所以在 dt->a 后面会有三个byte的填充,如果直接使用强制转换,那么 dt->a 仍然会从内存中读取4个byte,但是由于 dt->a 的数据类型为char,因此只会显示出第一个字节也就是c。

因此以上的程序被执行的时候,变量在内存中的变化如下(mem只取前9个byte。

答案见文末。

答案

1 答案: 5 5

2 答案: c 0

(你答对了吗?)

就上面两个题目,面试的时候去问,相信大量的人回答不对。但是这两个问题其实也就是知道了也就知道了,并没有什么一锤定音的功能,万万不能用这些问题去评价某个人,它们只是检测一个人对C语言的熟悉程度而已。