逻辑、数学与编程语言
了解编程语言中的条件运算符和逻辑运算符。
编程语言是一种形式化语言,包含一组指令,用于生成各种类型的输出。它可以是命令式(imperative)或声明式(declarative)的。
命令式意味着它有一系列需要执行的操作;而声明式则关注于指定期望的结果,而不说明如何实现这些结果。
目前存在数千种编程语言,且新语言正在快速涌现。然而,大多数编程语言都是命令式的。它们包含针对计算机执行特定任务的具体命令或指令,从而产生各种输出。
过程式编程
在自然语言中,比如英语,我们遇到过祈使语气,即使用动词构成命令或请求。例如:“做这件事”或“离开”,还有许多类似表达。通常,这类语句是针对第二人称的,但在特定语境下也可以涉及第一人称或第三人称,如“让我们来做这件事”。
同样地,命令式编程也由一系列具体命令组成,即一组专注于程序如何运行的指令。下面是一个在C语言中的简单过程式命令式编程示例:
1// C 2#include<stdio.h> 3#include<stdlib.h> 4 5void doSomething(void){ 6 printf("做点什么。"); 7} 8 9int main(int argc, char**argv){ 10 doSomething(); 11 return (EXIT_SUCCESS); 12}
在上述代码中,函数(方法)声明在被调用时会输出标准内容。在 main() 函数中,编译后的代码在调用 doSomething() 函数时执行相应操作。其输出如下:
1做点什么。
这段代码展示了过程式编程的工作原理。它是命令式编程范式的一部分。之所以称为“过程式”,是因为程序基于一个或多个过程、函数或子程序构建。

现在的问题是:离散数学的概念在这里处于什么位置?过程式编程与离散数学之间有何关系?
简单来说,程序要么成功构建,要么彻底失败。它不能持续运行下去。因此,程序的状态必须是离散的——只能是1或0,真或假。
面向对象编程
我们需要成功编译代码,这本身就是离散的。我们给出的指令也必须是离散的。最终,我们也需要离散的输出。命令式编程并不仅限于过程式编程,还包括面向对象编程范式。C++ 程序就是一个很好的例子。先看代码:
1// C++ 2#include<iostream> 3#include<string> 4 5using namespace std; 6 7class DoSomething{ 8 public: 9 string giveInstruction = "做点什么"; 10 11 void givingInstruction(){ 12 cout << giveInstruction << "\n"; 13 } 14}; 15 16int main(int argc, char**argv){ 17 DoSomething firstObject; 18 firstObject.givingInstruction(); 19 return 0; 20}
在C++中,public: 访问修饰符表示这些成员可以被类外部的函数(如 main() 或其他函数)访问。在Java中,我们需要为所有希望从类外部访问的成员显式添加 public 关键字。
上述C++代码实现了相同的功能,输出类型一致,但以一种更独立、更结构化的方式完成。
因此,逻辑先于数学,接着是算法或步骤,最后才是根据算法编写的代码。
在编程语言中,逻辑起着最关键的作用,因为它基于前提或假设推导出结论。此外,决策本身是离散的。这正是为什么在编程语言中,真值表扮演重要角色的原因。编程语言中的 if、if-else 或 else 条件语句引导我们得出唯一的推理结论。
在日常生活中,我们也通过观察应用类似的逻辑。下面我们通过一个简单的Java程序来理解这种逻辑推理的重要性。
条件判断
我们从第一个Java程序的输入示例开始。首先,在代码下方的输入框中输入一个 age 值。然后运行该代码。建议多次执行,输入不同的年龄值,如 18、45、50 和 61,并观察对应的输出结果。
点击“运行”按钮执行以下代码。
No configuration found for ID: f537a81cf23a9254de3e2efcebff70fd75349e1f97d03db1e972d90a31bd6cbc
使用不同输入值运行该程序三次后,得到以下输出:
-
输出1:
1请输入年龄: 245 3继续保持优秀,并帮助他人! -
输出2:
1请输入年龄: 218 3生日快乐! -
输出3:
1请输入年龄: 261 3准备退休了吗,还是想继续工作?
在上述Java代码中:
-
第9行:通过
Scanner(System.in)获取用户输入。 -
第12至20行:使用
if和else if判断特定年龄对应的不同响应。 -
注意,当
age变量取值为19–20、22–49和51–59时,会产生相同的输出结果。
上述Java代码基于若干可称为真值表的原则构建算法。其逻辑步骤具有普遍性,适用于Java程序员,并适用于所有编程范式。
有三种逻辑运算符:
- AND 运算符(用
&&表示); - OR 运算符(用
||表示); - NOT 运算符(用
!表示),用于将true转换为false,反之亦然。
当 && 两边的条件都为真时,结果为 TRUE;当 || 中任意一个条件为真时,结果也为 TRUE。! 的作用我们已经了解。
真值表
| A | B | A || B | A && B | !A |
|---|---|---|---|---|
| False | False | False | False | True |
| True | False | True | False | False |
| False | True | True | False | True |
| True | True | True | True | False |
这些逻辑运算依赖于条件运算符。它们也有不同的符号,如 ==、!=、<、>、>= 和 <=。根据所使用的符号执行不同的操作。例如,当两个条件相等时(使用 ==),就执行指定的操作。
Java/C++中的条件运算符
| 数学运算符 | Java/C++ | 说明 |
|---|---|---|
| = | == | 等于 |
| ≠ | != | 不等于 |
| < | < | 小于 |
| > | > | 大于 |
| ≤ | <= | 小于或等于 |
| ≥ | >= | 大于或等于 |
我们可以得出结论:逻辑、数学、算法和代码之间是紧密关联的。