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

 

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

简单的讲

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

别再傻傻用外部中断了!STM32H743定时器编码器模式4倍频测速保姆级配置(附CubeMX+HAL库代码) 本文详细介绍了STM32H743定时器编码器模式的4倍频测速配置方法,通过CubeMX和HAL库实现高效脉冲计数。相比传统外部中断方案,硬件编码器模式显著降低CPU占用率,提升测速精度,适用于电机控制和运动检测等高要求场景。 阅读详情

相关推荐

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6709

表达式和语句

本文主要介绍一下内容。

weixin_48302551的博客 764

神经网络学习笔记-波尔兹曼(Boltzmann)机

Boltzmann机是一种反馈随机神经网络 两种输出状态,单极性0或1。输出状态的取值根据概率统计法则决定,这种概率统计法则类似Boltzmann分布,部分反馈 它在神经元状态变化中引入了统计概率,网络的平衡状态服从Boltzmann分布,网络运行机制基于模拟退火算法。 离散Hopfield神经网络+模拟退火+隐单元=Boltzman机 DHNN全反馈,转移函数:符号函数 BM机网络拓扑...

求易学堂的博客 2612

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

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

z13903931414的博客 1357

IC618新手避坑指南:从零在Linux上配置Cadence Virtuoso环境(含cds.lib文件详解)

本文详细介绍了在Linux系统上配置Cadence Virtuoso IC618环境的完整指南,特别针对新手常见问题提供解决方案。重点解析了cds.lib文件的关键配置,包括库路径定义和工艺库管理,并分享了高效工作流设置和典型问题排查技巧,帮助工程师快速搭建稳定的EDA设计环境。

weixin_26805597的博客 551

R语言绘图中文显示全攻略:从乱码到完美适配

本文详细解析了R语言绘图中的中文显示问题,从乱码根源到完美适配方案。通过showtext、sysfonts和extrafont等工具包的应用,提供跨平台的中文显示解决方案,涵盖ggplot2图表、PDF/PNG输出及Shiny应用等场景,助力用户高效实现R绘图中文完美呈现。

hp777的博客 257

语句和表达式有什么不同

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

www_xuhss_com的博客 2067

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 865

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

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

qq_60504665的博客 1188

LibTV本地部署:AI漫剧创作完整解决方案与实战指南

如果你正在关注AI漫剧创作这个赛道,可能会发现一个有趣的现象:市面上的AI视频工具要么功能单一,要么云端服务昂贵且存在内容审核风险。而今天要介绍的LibTV本地部署方案,或许能为你打开一扇新的大门。 这个方案的核心是Seedance2.0与豆包AI的本地化集成,它真正解决的是创作者对内容自主权、成本控制和创作效率的三重需求。与红果、抖音等平台提供的标准化AI工具相比,本地部署意味着你可以完全掌控生成过程,不受平台规则限制,更重要的是——所有数据都在本地,不存在内容泄露风险。 1. 这篇文章真正要解决的问题

weixin_28745309的博客 520

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5720

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

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

justjavac(迷渡) 2524

Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ----------------------------------------------------------------------------------------------------------------- 汇总篇: Xilinx平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了 ----------------------------------------------------------...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

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

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

wfx的专栏 318

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

Qiuker_jl的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言的表达式与语句

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

奔梦记 6448

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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
下一篇: 代码之谜(三)- 运算符
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值