初学者学编程比如C语言往往是从一些简单的代码开始以熟悉语法比如int i 300; int temp 0; temp i; printf(%d\n, temp);这段代码是把变量i中存储的300赋给变量temp这样temp中也存储300了我们将在输出打印环境中看到300。不过如果只是单纯地背诵C语言语法依葫芦画瓢则有人可能写出这样一段代码int i 300; char temp 0; temp i; printf(%d\n, temp);这看起来是依葫芦画瓢没什么问题编译也可以通过也可以运行但结果不会如愿。你会发现机器会打印44而不是300。为什么原因不难这是因为在大多数平台char型变量只占一个字节而int要么至少是2字节要么4字节。我们就以4字节为例那么变量i实际存储的形式应该是00000000 00000000 00000001 00101100而由于char类型的temp只占一个字节所以它无法存储变量i的所有位而只存储低8位00101100而这低8位二进制数所对应的十进制值就是44。因此变量temp的值将是44。这个很基础的例子说明了我们为什么要理解编程而不可仅停留在对语法的简单复制尤其对于在电子领域使用C编程的朋友。因为在这种直接面对硬件的领域代码中任何一个预料之外的行为都可能造成严重后果。1996年6月4日法国航空航天公司Arianespace SA的Ariane 5火箭在发射37秒后偏离飞行路线开始解体并自毁导致超过3.7亿美元损失。这次事故的原因和刚才我们举的例子相当类似火箭沿用了上一代火箭中的某些代码将一个64位浮点数代表火箭的水平速度转换为16位有符号整数用C语言描述大概是这样int16_t convert_v(double velocity) { return (int16_t)velocity; }而这个浮点数velocity运行时传入的值在上一代火箭中没问题但在这一代由于火箭速度更快velocity更大就出问题了。由于没有进行范围检查表达式得出了错误的结果引发异常导致一系列连锁反应并最终触发自毁。当然并不是我们每个人都会从事这种对安全有严苛要求的工作但总体而言只掌握编程语言的编写是不够的。重新理解编程能让你在编程时潜移默化地深入底层掌控代码而不是简单的模仿。这可以让你在工作、面试中更具竞争力学习更有效率如虎添翼。
为什么仅学C语言不够,还得“重新理解编程”?
初学者学编程比如C语言往往是从一些简单的代码开始以熟悉语法比如int i 300; int temp 0; temp i; printf(%d\n, temp);这段代码是把变量i中存储的300赋给变量temp这样temp中也存储300了我们将在输出打印环境中看到300。不过如果只是单纯地背诵C语言语法依葫芦画瓢则有人可能写出这样一段代码int i 300; char temp 0; temp i; printf(%d\n, temp);这看起来是依葫芦画瓢没什么问题编译也可以通过也可以运行但结果不会如愿。你会发现机器会打印44而不是300。为什么原因不难这是因为在大多数平台char型变量只占一个字节而int要么至少是2字节要么4字节。我们就以4字节为例那么变量i实际存储的形式应该是00000000 00000000 00000001 00101100而由于char类型的temp只占一个字节所以它无法存储变量i的所有位而只存储低8位00101100而这低8位二进制数所对应的十进制值就是44。因此变量temp的值将是44。这个很基础的例子说明了我们为什么要理解编程而不可仅停留在对语法的简单复制尤其对于在电子领域使用C编程的朋友。因为在这种直接面对硬件的领域代码中任何一个预料之外的行为都可能造成严重后果。1996年6月4日法国航空航天公司Arianespace SA的Ariane 5火箭在发射37秒后偏离飞行路线开始解体并自毁导致超过3.7亿美元损失。这次事故的原因和刚才我们举的例子相当类似火箭沿用了上一代火箭中的某些代码将一个64位浮点数代表火箭的水平速度转换为16位有符号整数用C语言描述大概是这样int16_t convert_v(double velocity) { return (int16_t)velocity; }而这个浮点数velocity运行时传入的值在上一代火箭中没问题但在这一代由于火箭速度更快velocity更大就出问题了。由于没有进行范围检查表达式得出了错误的结果引发异常导致一系列连锁反应并最终触发自毁。当然并不是我们每个人都会从事这种对安全有严苛要求的工作但总体而言只掌握编程语言的编写是不够的。重新理解编程能让你在编程时潜移默化地深入底层掌控代码而不是简单的模仿。这可以让你在工作、面试中更具竞争力学习更有效率如虎添翼。