[ 2005/11/20 01:15 | by turbozv ]
[ 2005/11/09 07:16 | by turbozv ]
最近正好是如火如荼的Job hunting time,经常会和同学们一起讨论数据结构,算法,C语言的知识,或许我真的应该仔细记录一下这段经历。虽然自己已经拿到offer,不过可以作为其他同学面试的参考,对自己所学的知识也算是一个回顾。
Job Hunting -- 1.起因
C语言:
Job Hunting -- 2. sizeof运算符
Job Hunting -- 3. const与static
Job Hunting -- 4. C函数调用
算法:
Job Hunting -- 5. 排序
Job Hunting -- 6. 查找
Job Hunting -- 7. 搜索
数据结构:
Job Hunting -- 8. 线性表
Job Hunting -- 9. 字符串
Job Hunting -- 10. 堆栈和队列
Job Hunting -- 11. 树
Job Hunting -- 12. 图
其他:
Job Hunting -- 13. 经典书籍
Job Hunting -- 14. 编译器与解释器
Job Hunting 第一次讲座 幻灯片下载!
<大家有什么建议和意见请在评论中指出,谢谢!>
Job Hunting -- 1.起因
C语言:
Job Hunting -- 2. sizeof运算符
Job Hunting -- 3. const与static
Job Hunting -- 4. C函数调用
算法:
Job Hunting -- 5. 排序
Job Hunting -- 6. 查找
Job Hunting -- 7. 搜索
数据结构:
Job Hunting -- 8. 线性表
Job Hunting -- 9. 字符串
Job Hunting -- 10. 堆栈和队列
Job Hunting -- 11. 树
Job Hunting -- 12. 图
其他:
Job Hunting -- 13. 经典书籍
Job Hunting -- 14. 编译器与解释器
Job Hunting 第一次讲座 幻灯片下载!
[ 2005/11/08 09:16 | by turbozv ]
sizeof是C语言中的关键字,返回的结果是无符号整型常量size_t。
1)sizeof在编译期完成,我们应该把sizeof(xxx)看成一个size_t的常量,其中xxx的运算应完全忽略。如:
同样,可以给一个函数让sizeof运算,如:
2)对数组的sizeof。n个元素数组的大小是一个元素大小的n倍,常用sizeof(arr)/sizeof(arr[0])计算一个数组的长度(而且大家尽可放心编译器直接将其优化为一个整数,而不是两个整数的除运算)
3)对结构的sizeof,有两个影响因素: 结构中的元素的最大长度M,编译器的对齐设置N。
规则一:编译器对齐属性为N(1, 2, 4, 8, 16)字节(VC中用#pragma pack(N), 或者/ZpN,默认/Zp8)
规则二:当N大于元素最大长度M时,以M为准计算
另外,经过在VS2005上的尝试,对于#pragma pack(N),N为其他异常值的情况下(3, 5, 6, 7, -1, "xxx", 1.3....),以M为准
来给大家出一道考试题目,请写出输出结果:
int i = sizeof('a');
printf("%d", i);
我就不给出答案了(提示:用C和CPP作为文件后缀分别试试)
大家觉得没有问题的话再来几道:
int i = sizeof("a");
printf("%d", i);
int i = sizeof("a" + 1);
printf("%d", i);
... 未完 ...
<转载请注明出处>
Reference:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_sizeof_operator.asp
1)sizeof在编译期完成,我们应该把sizeof(xxx)看成一个size_t的常量,其中xxx的运算应完全忽略。如:
char i = 1;
int j = sizeof(i++);
int k = sizeof(i+0.1);
printf("%d %d %d", i, j, k); // 输出为 1 1 8,因为i++并不真正计算,sizeof只关心输入的数据类型,i+0.1被提升为double
int j = sizeof(i++);
int k = sizeof(i+0.1);
printf("%d %d %d", i, j, k); // 输出为 1 1 8,因为i++并不真正计算,sizeof只关心输入的数据类型,i+0.1被提升为double
同样,可以给一个函数让sizeof运算,如:
double ft(int *i) {
(*i)++;
return (*i) * 3.14;
}
void main()
{
int i = 1;
int j = sizeof(ft(&i));
printf("%d %d", j, i); // 输出为 8 1,因为ft()并没有运算,sizeof只关心ft()的返回类型是double(8)
}
(*i)++;
return (*i) * 3.14;
}
void main()
{
int i = 1;
int j = sizeof(ft(&i));
printf("%d %d", j, i); // 输出为 8 1,因为ft()并没有运算,sizeof只关心ft()的返回类型是double(8)
}
2)对数组的sizeof。n个元素数组的大小是一个元素大小的n倍,常用sizeof(arr)/sizeof(arr[0])计算一个数组的长度(而且大家尽可放心编译器直接将其优化为一个整数,而不是两个整数的除运算)
3)对结构的sizeof,有两个影响因素: 结构中的元素的最大长度M,编译器的对齐设置N。
规则一:编译器对齐属性为N(1, 2, 4, 8, 16)字节(VC中用#pragma pack(N), 或者/ZpN,默认/Zp8)
规则二:当N大于元素最大长度M时,以M为准计算
#pragma pack(1)
struct {
char a;
char b;
int c;
double d;
char *e;
} str_a;
printf("%d", sizeof(str_a)); // 输出为18, a:1,b:1, c:4, d:8, e:4,最小单位1
struct {
char a;
char b;
int c;
double d;
char *e;
} str_a;
printf("%d", sizeof(str_a)); // 输出为18, a:1,b:1, c:4, d:8, e:4,最小单位1
#pragma pack(4)
struct {
char a;
char b;
int c;
double d;
char *e;
} str_a;
printf("%d", sizeof(str_a)); // 输出为20, ab:4, c:4, d:8, e:4,最小单位4
struct {
char a;
char b;
int c;
double d;
char *e;
} str_a;
printf("%d", sizeof(str_a)); // 输出为20, ab:4, c:4, d:8, e:4,最小单位4
#pragma pack(16)
struct {
char a;
char b;
int c;
double d;
char *e;
} str_a;
printf("%d", sizeof(str_a)); // 输出为24, abc:8, d:8, e:8,最小单位8(因为8<16,以8为准)
struct {
char a;
char b;
int c;
double d;
char *e;
} str_a;
printf("%d", sizeof(str_a)); // 输出为24, abc:8, d:8, e:8,最小单位8(因为8<16,以8为准)
另外,经过在VS2005上的尝试,对于#pragma pack(N),N为其他异常值的情况下(3, 5, 6, 7, -1, "xxx", 1.3....),以M为准
来给大家出一道考试题目,请写出输出结果:
int i = sizeof('a');
printf("%d", i);
我就不给出答案了(提示:用C和CPP作为文件后缀分别试试)
大家觉得没有问题的话再来几道:
int i = sizeof("a");
printf("%d", i);
int i = sizeof("a" + 1);
printf("%d", i);
... 未完 ...
<转载请注明出处>
Reference:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_sizeof_operator.asp