知识分享 – 基础知识 | 每日一面(22)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:为什么如下的代码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) 不能达到需要的效果。当两个整数做除法而结果赋与一个浮点变量时, 也有可能有同样类型的问题,解决方法也是类似的。

读者:我需要根据条件把一个复杂的表达式赋值给两个变量中的一个。可以用下边这样的代码吗?

((condition) ? a : b) = complicated_expression;

小林:不能。? : 操作符, 跟多数操作符一样, 生成一个值, 而不能被赋值。换言之, ?: 不能生成一个“左值”。如果你真的需要, 你可以试试下面这样的代码:*((condition) ? &a : &b) = complicated_expression;尽管这毫无优雅可言。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完