问题1:为什么如下的代码 int a = 100, b = 100; long int c = a * b; 不 能工作?
根据 C 的内部类型转换规则, 乘法是用 int 进行的, 而其结果可能在转换为 long 型并赋给左边的 c 之前溢出或被截短。可以使用明确的类型转换, 强迫乘法 以 long 型进行: long int c = (long int)a * b;
注意, (long int)(a * b) 不能达到需要的效果。 当两个整数做除法而结果赋与一个浮点变量时, 也有可能有同样类型的问题, 解决方法也是类似的。
问题2: 我需要根据条件把一个复杂的表达式赋值给两个变量中的一个。 可以用下边这样的代码吗? ((condition) ? a : b) = complicated expression;
不能。? : 操作符, 跟多数操作符一样, 生成一个值, 而不能被赋值。换言之, ? : 不能生成一个 “左值”。如果你真的需要, 你可以试试下面这样的代码: *((condition) ? &a : &b) = complicated_expression; 尽管这毫无优雅可言。
问题3:声明 struct x1 { . . . }; 和 typedef struct { . . . } x2; 有什么不 同?
第一种形式声明了一个 “结构标签”; 第二种声明了一个 “类型定义”。主要的 区别是在后文中你需要用 “struct x1” 引用第一种, 而用 “x2” 引用第二种。也就是说, 第二种声明更像一种抽象类新用户不必知道它是一个结构, 而在声明它的实例时也不需要使用 struct 关键字。
问题4:为什么 struct x { . . . }; x thestruct; 不对?
C 不是 C++。结构标签不能自动生成类型
问题5:是否有自动比较结构的方法?
没有。编译器没有简单的好办法实现结构比较 (即, 支持结构的 == 操作符), 这也符合 C 的低层特性。简单的按字节比较会由于结构中没有用到的 “空洞” 中 的随机数据 (参见问题 2.10) 而失败; 而按域比较在处理大结构时需要难以接受的 大量重复代码。 如果你需要比较两个结构, 你必须自己写函数按域比较。