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

C语言今天带来两道有意思的c语言问题 给大家,看看机智的小伙伴们能不能答上来!
废话不多说,直接上代码。
1、关于编译期的sizeof
#include<stdio.h>
main()
{
int i = 5;
int j = 5;
sizeof(++i);
sizeof(j++);
printf(“i: %d j: %d\n”,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: %d\n”,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。

C语言
答案见文末。

答案
1 答案: 5 5
2 答案: c 0
(你答对了吗?)
就上面两个题目,面试的时候去问,相信大量的人回答不对。但是这两个问题其实也就是知道了也就知道了,并没有什么一锤定音的功能,万万不能用这些问题去评价某个人,它们只是检测一个人对C语言的熟悉程度而已。
欢迎大家留言区讨论:https://jq.qq.com/?_wv=1027&k=5TCblLA

C语言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值