C语言小问题二(续上节)

问题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) 而失败; 而按域比较在处理大结构时需要难以接受的 大量重复代码。 如果你需要比较两个结构, 你必须自己写函数按域比较。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值