代码之谜(二) - 语句与表达式

虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值。 在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。

简单的讲

  • “表达式”(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(函数式编程)的一些核心思想了。


骗分导论 CSP、NOIP、蓝桥杯、PAT、USACO等竞赛的算法骗分技巧 轻松省三 问题来了,那么多座桥,炸一座就破坏岛屿的联系,可能性微乎其微(除非特别设计数据)。它们的价值极大,不仅能初步帮你检验程序的对错,而且,如果你不会做这道题,你就可以直接输出样例!在OI考试中最后难的题数据最后的几个,他们往往不会创造新的数据,此时就可以直接输出最后几个数据了。需要运用《骗分导论》第3章中学到的知识,先写出朴素算法,然后造一些数据,可能就会发现规律。有些时候,问题的答案可能很有特点:对于大多数情况,答案是一样的。据说,在NOIP2013中,有人最后一题不会,愤然打了个随机数,结果得了。 阅读详情

相关推荐

STM32F103 CAN通信避坑指南:从标准库配置到收发测试的完整流程

本文详细介绍了STM32F103 CAN通信的实现流程,从标准库配置到收发测试,帮助开发者避开常见陷阱。内容涵盖硬件连接、波特率计算、过滤器配置及错误处理等关键环节,提供实用的代码示例和调试技巧,确保CAN通信的稳定性和可靠性。

weixin_30627341的博客 324

表达式和语句

本文主要介绍一下内容。

weixin_48302551的博客 764

ESP8266 进行HDLC解码,AX.25,APRS

/************************************************************** 函数名:aprs_wait_begin() 参 数:无 返回值:bool true=得到合法脉冲,false=未得到 说 明:等待第1个833us高脉冲,判断范围 730-930,其他忽略 ***************************************************************/ bool aprs_wait_begin(){ stati

蓝蓝的博客 1626

什么是语句?什么是表达式?怎么区分?

语句和表达式是编程语言中的两个基本概念。

z13903931414的博客 1357

SAP ABAP MIGO增强实战:自定义页签与字段的完整实现指南

本文详细介绍了SAP ABAP中MIGO增强的实战指南,包括自定义页签与字段的完整实现步骤。通过BADI增强技术,开发者可以快速满足企业个性化需求,如添加供应商批次号等特殊字段。文章涵盖数据存储结构设计、BADI框架实现、核心方法编写及数据持久化方案,帮助用户高效完成MIGO屏幕增强开发。

study的专栏 774

同源策略与跨域

前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到。大致看了下腾讯云关于设置跨域访问的教程,按照前端同学给的域名等选项就给配了,而且测试下来也是好的。但是呢一直不知道什么是跨域这里就做一个简单的学习记录。 一、同源策略 同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能。同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...

mijichui2153的博客 1万+

语句和表达式有什么不同

JavaScript中的语句和表达式有什么不同之处?对于这个问题,我似乎知道答案,但当我尝试向别人解释时,我却语塞了。对于这个问题我有一种感觉,但无法清晰的表达出来。我后来才意识到,这个问题极其重要。它可以说是房屋的承重墙,将有助于支撑大量的JavaScript知识。对React开发者来说,更为如此。你不得不记住的那些JSX规则,以及总是忘记遵守的那些规则,大部分都是语句/表达式双重性的结果。在这篇文章中,我将分享我对这两者区别的一些感悟,以及我们如何在日常工作中使用这些信息。if/elsefor。...

www_xuhss_com的博客 2067

SecureCRT串口连接保姆级教程:从驱动安装到波特率设置(附常见问题解决)

本文提供SecureCRT串口连接的保姆级教程,涵盖从USB转串口驱动安装、端口识别到波特率等核心参数设置的完整流程。针对连接失败、乱码、键盘输入无响应等高频问题,给出了深度排查与解决方案,帮助网络与嵌入式开发新手快速掌握串口调试技能。

weixin_29281941的博客 433

什么是语句,什么是表达式,怎么区分?那些是表达式,那些是语句?

语句(Statement)和表达式(Expression)在编程和语言学中都有特定的定义和用途,但在这里我会主要解释它们在编程中的概念。

qq_60504665的博客 1188

使用LSTM实现自动调制识别(RML2018.01a)

目录一、LSTM的代码实现1.1 导入包1.2 数据读取及数据集划分1.3 数据预处理1.4 构建LSTM模型 本文基于RML2018.01a大型数据集,给出LSTM的信号识别的实现方式(附代码) RML2018.01a数据集信息如下: 模型 传送门 CNN/ResNet 使用CNN/ResNet实现自动调制识别(RML2018.01a) LSTM 使用LSTM实现自动调制识别(RML2018.01a)) 一、LSTM的代码实现 1.1 导入包 import numpy as np

QAQIknow的博客 6121

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 133

【转】代码之谜(二) - 语句与表达式

虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值。 在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。 简单的讲 “表达式”(expression)是一个单纯的运算过程,总是有返回值;“语句”(statement)是执行某种操作,没有返回值。 使用表达式也是函数式编程语言所提倡的,而传统命令式编程语言都是语句

wfx的专栏 318

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 234

代码之谜(二)- 语句与表达式

虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每个表达式都有一个值。在此之外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被经常忽略的矛盾。 简单的讲 "表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。 使用表达式也是函数式编程语言所提倡的,而传统命令式编程语言都是语句的堆砌。

GarfieldEr007的专栏 947

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【C语言语法】表达式与语句的区别与联系

//一开始只是想归纳C语言语法的,后来写着写着就写偏了。。。 我觉得编程是门实践性很强的专业,很多语法上细碎的东西可能记不住,但只要敲一下试验一下就行。 会想到要归纳C语言的语法,起因是在看题解的时候发现了这样一句话: if(sum>=n) sum-=(l*l),l++; 这里两个的两个赋值语句竟然可以用逗号分隔。这样就只需要一个分号,可以不加大括号了,太舒服了,因为我个人写代码的习惯就是尽量简洁,能不加大括号那肯定不加。所以逗号和分号到底有什么区别呢? ...

Qiuker_jl的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C语言的表达式与语句

C语言中,表达式是显示如何计算值的公式。语句是C语言的关键特性之一,表示程序运行时执行的命令。本文介绍并示例了C语言中的表达式和语句

奔梦记 6448

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Rust 表达式与语句的区别:理解基于表达式的语言哲学

很高兴和你探讨这个 Rust 语言设计的核心概念!表达式和语句的区分是理解 Rust 优雅性的关键!让我们深入探索吧!🚀。

lyw_277092089的博客 1830

JavaScript 表达式与语句:编程基础

表达式是由变量、常量、运算符和函数调用等组成的代码片段,它会计算出一个值。表达式可以是简单的,如一个常量或变量,也可以是复杂的,由多个运算符和操作数组合而成。语句是 JavaScript 程序中的执行单元,它通常表示一个完整的操作。语句可以包含表达式,但不一定会返回一个值。语句的作用是控制程序的流程、定义变量、执行函数等。JavaScript 中的表达式和语句是构建程序的基础。表达式用于计算值,而语句用于执行操作和控制程序流程。理解它们的概念、区别和使用方法,能够帮助我们编写更加清晰、高效的代码。

顾林海 2707

JS表达式与语句的区别

提示:JS表达式和语句很基础,但是在vue的数据绑定中,其两者的区别很重要了 Vue 数据绑定的官方描述如下: 对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持。 {{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bi...

迷途的M的博客 2950

C#语言—表达式与基本语句

前言   上一篇博客总结了变量的基本知识,最后简单地提到了赋值等操作,这就引出了这篇博客的内容,表达式与运算符中如何利用,表达变量等其他操作数;以及如何将这些表达式灵活地引用一些if 语句,for语句。接下来,小编通过传智播客视频的学习,总结出如下内容,与大家交流。 表达式 一、概念 1.表达式是运算符和操作数的字符串。 2.表达式可以由许多嵌套的子表达式构成

冯浩月 3289

C语言:语句与表达式

目录 【问题引入】 【问题分析】 1.表达式(expression): 每一个表达式都存在一个值 2.语句(statement): 【练习】 【问题引入】 在学习C语言的过程中,我们不时会遇到一些代码,如: int a = 3 , b = 4; (a = 0) && (b = 3); 对于一些刚接触C语言的萌新(比如我),也会对上述式子产生疑惑。因为根本不知道是啥意思,更不知道这样的操作会对a,b的值产生什么影响。 接下来我会谈谈我的一些想法。(希望大神指正).

weixin_61944889的博客 4216

【Java编程动手学】Java中的表达式与语句

本文系统介绍了Java编程中的表达式、语句和语句块等核心概念。表达式用于计算值(如算术、逻辑表达式),语句是执行操作的最小单位(如赋值、控制语句),语句块则定义代码作用域。文章详细讲解了程序执行顺序、条件分支(if-else、switch)和循环结构(for、while、do-while)的使用方法,并通过代码示例说明break与continue的用法。掌握这些基础知识是编写高效Java程序的关键。

杰西笔记 1248
上一篇: 自己动手设计 PHP MVC 框架(一)——URL
下一篇: 代码之谜(三) - 运算符
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2405粉丝 124原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值