虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点每个表达式都有一个值。 在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。
简单的讲
- “表达式”(expression)是一个单纯的运算过程,总是有返回值;
- “语句”(statement)是执行某种操作,没有返回值。
使用表达式也是函数式编程语言所提倡的,而传统命令式编程语言都是语句的堆砌。
表达式和语句如何区分呢? 最简单最直观的鉴别方法就是,后面有分号的是语句, 这是一个充分条件而不是必要条件。 有分号,就是语句;没有分号,就不一定了,也可能是语句,也可能是表达式。
在动态语言——比如javascript——中是通过上下文来区分这两者的。
假如如果function foo(){}
在一个赋值表达式的一部分,则认为它是一个表达式。表达式的一部分,也是表达式。
而如果function foo(){}
被包含在一个函数体内,或者位于程序中,则将它作为一个语句。
function foo(){}; // 声明,因为它是程序的一部分
var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分
new function bar(){}; // 表达式,因为它是New表达式的一部分
(function(){
function bar(){}; // 声明,因为它是函数体的一部分
})();
还有一种不那么显而易见的表达式,就是被包含在一对圆括号中——(function foo(){})
。 将这种形式看成表达式同样是因为上下文的关系:
(和)构成一个分组操作符,而分组操作符只能包含表达式:
(function foo(){}); // 函数表达式:注意它被包含在分组操作符中
(var x = 5); // error! 分组操作符只能包含表达式,不能包含语句(这里的var就是语句)
今天突然有人问我:
alert(eval(data));
为什么会报错呢?data 是一个对象,按理说应该会弹出 ObjectObject啊。 这是因为,当我们写
{"username" : "justjavac"}
时,它并不是一个对象。 因为我们知道有一种表示数据的方法叫做 json(javascript对象表示法), 所以想当然的认为这应该是一个对象。 其实,在大部分编程语言中,大括号({})表示的不是对象,而是代码块,这段代码其实等价于
{
"username" : "justjavac"
}
很显然,"username" : "justjavac"
并不是合法的语句。 然而解决方法也很简单,就是添加括号——分组操作符
({"username" : "justjavac"})
这样就构成了一个合法的表达式,当我们进行 json 对象解析的时候可以写如下代码:
eval('(' + json + ')')
在表达式中,只能存在表达式,不能存在语句。
例如表达式
(var a = 4) + 4;
这段代码将产生一个错误,因为var a = 4
是一个语句, 而不是表达式——对表达式求值必须返回值,但对语句求值则未必有返回值。
类似的
if (var a = 0) {}
也产生错误,因为var a = 0' 是一条语句,而 **语句没有返回值**。if 语句的语法结构为
if (expression) {
statement;
statement;
……
}
因此
if (var a = 0) {}
是错误的,但是
if (true) {
var a = 0;
}
则是正确的。
最后重申一下,每个表达式都有一个值。 理解了这个,就可以很容易的理解 FP(函数式编程)的一些核心思想了。
分享到:
相关推荐
Java中for语句特殊使用方法---表达式3为空.pdf 学习资料 复习资料 教学资源
二、条件语句 4.switch语句 switch语句用于根据表达式的值确定在几种不同值时执行不同的语句块,其语法格式如下: 三、循环语句 循环结构用于重复执行某一语句块,在PHP中提供了3种形式的循环语句:while循环语句、...
Java中for语句特殊使用方法---表达式1为空.pdf 学习资料 复习资料 教学资源
Java中for语句特殊使用方法---表达式1、2、3均为空.pdf 学习资料 复习资料 教学资源
1.1 代码之谜(零)- 其实,你不懂代码 3 1.2 代码之谜(一)- 有限与无限(从整数的绝对值说起) 7 1.3 代码之谜(二)- 语句与表达式 9 1.
Java语言程序设计:JAVA_3-运算符、表达式和语句.ppt
初步掌握JAVA的运算符,表达式和语句。 2【实验内容】 1. 完成书本35页作业题1~5(五道题). 2. 完成书本33-35页问答题1~11(十一道题). 3【实验步骤和结果】(含源码和界面截图) 第三章作业题 /*3.1/ 【源代码】 ...
Java中for语句特殊使用方法---内含多个表达式.pdf 学习资料 复习资料 教学资源
Java程序设计精编教程(第2版) 第4章_运算符、表达式与语句
python 的三元表达式 Python的三元表达式是一种简洁而强大的语法结构,它可以在一行代码中实现条件判断和赋值操作。在本文中,我们将深入探讨Python的三元表达式,包括其语法、用法和注意事项。 让我们来看一下...
这些基础的知识我们还是要有的。。。。。。 不说话,看标题--- c#语句、表达式和运算符
循环语句 循环语句是Python中最常用的语句之一,它可以让程序重复执行某些操作,直到满足某个条件才停止。Python中有两种循环语句:for循环和while循环。 for循环可以遍历任何序列,如列表、元组、字符串等。语法...
290-用do-while语句控制P0口8位LED流水点亮(51单片机C语言实例Proteus仿真和代码)290-用do-while语句控制P0口8位LED流水点亮(51单片机C语言实例Proteus仿真和代码)290-用do-while语句控制P0口8位LED流水点亮(51...
1、 查询Student表中的所有记录的Sname、Ssex和Class列。 SQL语句:select sname,ssex,class from student ...Lambda表达式: Students.Select( s => new { SNAME = s.SNAME,SSEX = s.SSEX,CLASS = s.CLASS })
错误定位是软件调试中最重要且最...通过实验,将训练出的秩函数与已经提出的秩函数(如Tarantula,Ochiai等)进行比较分析,结果表明,基于基因表达式编程的错误定位方法具有更精确的错误定位效果和更显著的定位效率。
包括: 运算符、表达式与语句笔记 运算符、表达式与语句视频 运算符、表达式与语句源代码
模仿SQL语句的正则表达式练习,是我学习正则表达式过程中,对字符串经常sql语句匹配,达到练习正则表达式的目的。语句中包括了,"创建超级用户权限,"*.*"代表数据库里的所有数据,"root"代表超级用户名称,"%"代表...
288-用for语句控制蜂鸣器鸣笛次数(51单片机C语言实例Proteus仿真和代码)288-用for语句控制蜂鸣器鸣笛次数(51单片机C语言实例Proteus仿真和代码)288-用for语句控制蜂鸣器鸣笛次数(51单片机C语言实例Proteus仿真和代码...
二.相关知识: 1 形式语言基础及其文法运算 2 两种算法:(1)表达式的递归下降子程序分析法 (2)表达式的LL(1)分析算法 三.实验内容 1 设计表达式的语法分析器算法 2 编写代码并上机调试运行通过 要求:...