两个超级有意思的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语言的熟悉程度而已。
- 用AlphaGo来做股票交易会怎样?机器学习预测股票靠谱么?
- 开发 | 深度神经网络可视化工具集锦
- CSS3三维变形,其实很简单!
- 使用 pandas处理股票数据并作分析
- 用R语言做时间序列分析(附数据集和源码)
- 【android开发】Android GUI系统学习1:Gralloc
- 【kaggle实战】从KNN,LR,SVM,RF到深度学习
- 开发 | 训练一个AI给颜值打分,公平公正!
- 【android开发】Android HAL模块实现
- 让剁手党洞察物体细节,“放大镜”当之无愧
- CSS3过渡,不再为JS动画而犯愁
- 【编程基础】c语言中获取整数和浮点数的符号位
- 前端特效开发 | JS实现聚光灯看图效果
- 【专业知识】Android主线程的消息系统(Handler\Looper)
- 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 数组属性和方法
- 数据分析与数据挖掘 - 04科学计算
- SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值
- JavaScript 启动性能瓶颈分析与解决方案
- 大白话理解Vuex
- 【Java面试总结】计算机网络
- volatile关键字 Krains 2020-08-26
- synchronized关键字 Krains 2020-08-25
- happens-before Krains 2020-08-26
- ReentrantLock可重入锁 Krains 2020-08-27
- Java中的线程 Krains 2020-08-24
- CAS Krains 2020-08-25
- 96. 不同的二叉搜索树 II Krains 2020-09-03 树
- 410. 分割数组的最大值 Krains 2020-08-29 20:21:39 动态规划二分查找
- 字典树 Krains 2020-09-01
- redis学习(十)