IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:函数声明

共 2 篇相关文章

IT 累计浏览 5,719

为什么C语言需要函数声明

这篇讲的是作者从同事遇到的一个诡异bug出发,揭示了C语言中“函数声明”为何不可或缺。同事的代码中,一个返回double的函数,在函数内部打印的值和外部接收到的值差异巨大。通过反汇编,作者发现了关键线索:编译器生成了一条将整型转换为双精度浮点的指令(cvtsi2sd)。 根因在于,当函数在别的源文件中定义,而调用方没有其声明时,编译器在编译阶段并不知道该函数的真实面貌。它会默认函数返回整型(放入eax寄存器)。由于调用方实际期望一个浮点值(应放入xmm0寄存器),编译器就在调用后强行做了一次类型转换,从而导致了值的错误。问题不仅限于返回值,未声明的函数参数也会导致编译器忽略类型检查,可能引发更隐蔽的栈或寄存器传参错误。 作者指出,现代编译器如GCC能通过-Wimplicit-function-declaration选项对此发出警告。根本的解决之道是养成良好习惯,开启-Wall选项,并确保在使用任何外部函数前都进行正确声明。

IT 累计浏览 2,881

Javascript中的函数声明和函数表达式

这篇讲的是JavaScript中两种基础却常被混淆的语法:函数声明与函数表达式。作者从Google Code Search中一个巧妙的写法——`~function(){}();`入手,瞬间抓住了读者的好奇心。 文章的核心是厘清二者的根本区别。函数声明(如 `function foo() {}`)会被“提升”(Hoisting),即在执行上下文创建阶段就被放入作用域,因此你可以在声明前调用它。而函数表达式(如 `var foo = function() {}`)则不会提升,必须在定义后才能调用。 作者通过一个具体的代码执行流程图和步骤分解,清晰地展示了引擎如何处理这两种语法。文中还深入探讨了立即执行函数表达式(IIFE)的写法与用途,解释了开头代码中 `~` 运算符的作用——它仅仅是一个巧妙的语法触发器,目的是让解析器将 `function` 关键字识别为表达式的一部分,从而允许后面紧跟圆括号进行调用。 文章没有停留在语法对比,而是引导读者思考这种差异在实际编码中带来的影响,比如代码组织、模块化模式等。结尾抛出的一个关于提升行为的思考题,能促使读者主动回顾和巩固所学。