两个超级有意思的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语言的熟悉程度而已。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Dynamic Programming - 120. Triangle
- Dynamic Programming - 63. Unique Paths II
- Tree - 109. Convert Sorted List to Binary Search Tree
- Tree - 108. Convert Sorted Array to Binary Search Tree Easy
- Tree - 236. Lowest Common Ancestor of a Binary Tree
- Tree - 235. Lowest Common Ancestor of a Binary Search Tree
- Tree - 98. Validate Binary Search Tree
- Tree - 199. Binary Tree Right Side View
- Tree - 103. Binary Tree Zigzag Level Order Traversal
- Tree - 107. Binary Tree Level Order Traversal II
- Trie - 212. Word Search II
- Trie - 211. Add and Search Word - Data structure design
- Trie - 208. Implement Trie (Prefix Tree)
- Tree - 337. House Robber III
- Tree - 250. Count Univalue Subtrees