Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3920709
  • 博文数量: 534
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4800
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(534)

文章存档

2024年(1)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类: C/C++

2007-01-15 22:13:26

1 在 C 语言中实现抽象数据类型什么方法最好?
让客户使用指向没有公开定义 (也许还隐藏在类型定义后边) 的结构类型的指针是一个好办法。只要不访问结构成员, 声明和使用 ``匿名'' 结构指针 (不完全结构类型指针)是合法的。这也是使用抽象数据类型的原因。

2 在 C 中是否有模拟继承等面向对象程序设计特性的好方法?
把函数指针直接加入到结构中就可以实现简单的 ``方法''。你可以使用各种不雅而暴力的方法来实现继承, 例如通过预处理器或含有 ``基类'' 的结构作为开始的子集, 但这些方法都不完美。 很明显, 也没有运算符的重载和覆盖 (例如, ``导出类'' 中的 ``方法''), 那些必须人工去做。
显然的, 如果你需要 ``真'' 的面向对象的程序设计, 你需要使用一个支持这些特性的语言, 例如 C++。

3 为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充?
为了确保分配连续的结构数组时正确对齐, 结构可能有这种尾部填充。即使结构不是数组的成员, 填充也会保持, 以便 sizeof 能够总是返回一致的大小。

4 如何确定域在结构中的字节偏移?
ANSI C 在 中定义了  offsetof() 宏, 用 offsetof(struct s, f) 可以计算出域 f 在结构 s 中的偏移量。 如果出于某种原因, 你需要自己实现这个功能, 可以使用下边这样的代码:
    #define offsetof(type, f) ((size_t) \
        ((char *)&((type *)0)->f - (char *)(type *)0))

这种实现不是 100% 的可移植; 某些编译器可能会合法地拒绝接受。

5 这是个巧妙的表达式:  a ^= b ^= a ^= b  它不需要临时变量就可以交换 a 和 b 的值。
这不具有可移植性。它试图在序列点之间两次修改变量 a, 而这是无定义的。
例如,有人报告如下代码:
    int a = 123, b = 7654;
    a ^= b ^= a ^= b;
在 SCO 优化 C 编译器 (icc) 下会把 b 置为 123, 把 a 置为 0。

6 一个指针变量分配多少内存?
这是个挺有误导性的问题。当你象这样声明一个指针变量的时候,
    char *p;
你 (或者, 更准确地讲, 编译器) 只分配了足够容纳指针本身的内存; 也就是说, 这种情况下, 你分配了 sizeof(char*) 个字节的内存。但你还没有分配任何让指针指向的内存。

7 我认为我的编译器有问题: 我注意到 sizeof('a') 是 2 而不是  1 (即, 不是 sizeof(char))。
可能有些令人吃惊, C 语言中的字符常数是 int 型, 因此 sizeof('a') 是  sizeof(int), 这是另一个与 C++ 不同的地方。

8 为什么这些代码  while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); }  把最后一行复制了两遍?
在 C 语言中, 只有输入例程试图读并失败以后才能得到文件结束符。换言之, C 的 I/O 和 Pascal 的不一样。通常你只需要检查输入例程的返回值, 例如, fgets() 在遇到文件结束符的时候返回 NULL。实际上, 在任何情况下, 都完全没有必要使用 feof()。

9 我第一次把一个程序分成多个源文件, 我不知道该把什么放到 .c 文件, 把什么放到 .h 文件。(``.h" 到底是什么意思?)
作为一般规则, 你应该把这些东西放入头 (.h) 文件中:
    * 宏定义 (预处理 #defines)
    * 结构、联合和枚举声明
    * typedef 声明
    * 外部函数声明(参见问题 1.4)
    * 全局变量声明
当声明或定义需要在多个文件中共享时, 尤其需要把它们放入头文件中。特别是, 永远不要把外部函数原型放到 .c 文件中。 参见问题 1.3。
另一方面, 如果定义或声明为一个 .c 文件私有, 则最好留在 .c 文件中。

10 联合既可以出现在结构内, 它的成员也可以是结构。
  例如:
  struct{
      int age;
      char *addr;
      union{
          int i;
          char *ch;
      }x;
  }y[10];
若要访问结构变量y[1]中联合x的成员i, 可以写成:
    y[1].x.i;

11 枚举类型变量的赋值和使用
main(){
 enum weekday
 {
  sun,mon,tue,wed,thu,fri,sat
 } a,b,c;
 a=sun;
 b=mon;
 c=tue;
 printf("%d,%d,%d",a,b,c);
}

12 位域
struct bs
{
 unsigned a:4
 unsigned :0 /*空域*/
 unsigned b:4 /*从下一单元开始存放*/
 unsigned c:4
}
struct k
{
 int a:1
 int :2 /*该2位不能使用*/
 int b:3
 int c:2
};
部分来源于:
阅读(1605) | 评论(0) | 转发(0) |
0

上一篇:C近来开发体会

下一篇:天平向谁倾斜

给主人留下些什么吧!~~