1.常用数据类型
打开PyCharm开发工具,新建一个名为demo01.py文件,python的常用数据类型(也叫字面量)有整型(如:123)、浮点型(如:1.23)、字符型(如:"123")等等,这里先认识一下这三种吧,在编辑器中编写代码,如下图所示
2.代码注释
2025年06月13日
1.常用数据类型
打开PyCharm开发工具,新建一个名为demo01.py文件,python的常用数据类型(也叫字面量)有整型(如:123)、浮点型(如:1.23)、字符型(如:"123")等等,这里先认识一下这三种吧,在编辑器中编写代码,如下图所示
2.代码注释
2025年06月13日
package cangjie_test
import std.ast.*
import std.math.numeric.*
import std.math.*
import std.console.*
// 元编程
// 一个相当好玩的特性
// 二元操作包装枚举
enum BinaryWrap {
| Fail
| Lit(Decimal)
| Mul(BinaryWrap, BinaryWrap) // *
| Div(BinaryWrap, BinaryWrap) // /
| Add(BinaryWrap, BinaryWrap) // +
| Sub(BinaryWrap, BinaryWrap) // -
| Parent(BinaryWrap) // ()
}
main() {
// 输出提示语句
output("请输入四则运算表达式:")
// 从命令行输入
while (let Some(expr) <- Console.stdIn.readln()) { // 循环读取
// 动态解析一条表达式
let tokens = cangjieLex(expr)
// 将表达式符合集解析成仓颉表达式
let _expr = parseExpr(tokens)
// 输出表达式语法树
// _expr.dump()
// 解析成二元操作树
let binaryTree = parseBinary(_expr)
// 计算结果
let val = compute(binaryTree)
output("${expr} = ${val}\n")
// 输出提示语句
output("请输入四则运算表达式:")
}
}
// 包装一个控制台输出函数
func output(msg: String) {
Console.stdOut.write(msg) // 写入消息
Console.stdOut.flush() // 刷入缓存
}
// 包装成二元操作树
func parseBinary(expr: Expr): BinaryWrap {
match (expr) {
case v: BinaryExpr => match (v.op.kind) {
case TokenKind.ADD => BinaryWrap.Add(parseBinary(v.leftExpr), parseBinary(v.rightExpr))
case TokenKind.SUB => BinaryWrap.Sub(parseBinary(v.leftExpr), parseBinary(v.rightExpr))
case TokenKind.MUL => BinaryWrap.Parent(BinaryWrap.Mul(parseBinary(v.leftExpr), parseBinary(v.rightExpr)))
case TokenKind.DIV => BinaryWrap.Parent(BinaryWrap.Div(parseBinary(v.leftExpr), parseBinary(v.rightExpr)))
case _ =>
output("不支持的操作符'${v.op.value}'")
BinaryWrap.Fail
}
case v: ParenExpr => BinaryWrap.Parent(parseBinary(v.parenthesizedExpr))
case v: LitConstExpr => match (v.literal.kind) {
case TokenKind.INTEGER_LITERAL | TokenKind.FLOAT_LITERAL => BinaryWrap.Lit(Decimal(v.literal.value))
case _ =>
output("不支持的数值类型'${v.literal.value}'")
BinaryWrap.Fail
}
case _ =>
output("不支持的语法'${expr.toTokens()}'")
BinaryWrap.Fail
}
}
// 计算结果
func compute(root: BinaryWrap): Decimal {
match (root) {
case BinaryWrap.Mul(l, r) => compute(l) * compute(r)
case BinaryWrap.Div(l, r) => compute(l) / compute(r)
case BinaryWrap.Add(l, r) => compute(l) + compute(r)
case BinaryWrap.Sub(l, r) => compute(l) - compute(r)
case BinaryWrap.Parent(l) => compute(l)
case BinaryWrap.Lit(l) => l
case BinaryWrap.Fail =>
output("无法计算")
Decimal(0.0)
}
}
2025年06月13日
最近后台收到一条留言:"现在Rust和Go都吹得天花乱坠,内存安全、并发简单,那C语言这种老古董怎么还不淘汰?"我盯着屏幕笑出了声——这不就是十年前Java火的时候,大家问C++什么时候消失的翻版吗
说来有趣,编程语言圈子的鄙视链就像北京二环的房价,永远在变又永远不变。可C语言就像胡同口晒太阳的老大爷,任你高楼起高楼塌,人家捧着搪瓷缸子悠然自得。今天咱们就掰扯掰扯,这个1972年诞生的"活化石",凭什么在RustGo的围剿下还能活得这么滋润?
2025年06月13日
以下是如何使用 Makefile 编译C语言代码的详细教程,适合初学者理解其核心概念和操作步骤。
当项目包含多个源文件(如 .c 和 .h)时,手动逐个编译效率低下且容易出错。
Makefile 的作用:
2025年06月13日
作为一名以Java为主的开发人员,深感不理解操作系统底层原理的痛苦,为了能更好掌握操作系统的相关知识点,因此我发自内心决定结合实践重学C语言这门编程语言。
重学C语言的第一个步骤,我决定从这个pun.c简单的例子入手,具体代码如下:
#include <stdio.h>
int main(void) {
printf("To C,or not to C: that is a question.\n");
return 0;
}
2025年06月13日
这个脑图是针对Keil工具进行C程序开发的入门介绍,主要内容包括工程文件的设置、特殊功能寄存器(SFR)的使用、代码执行速度的基本概念以及一个简单的入门示例程序。接下来我会详细讲解脑图中的每个部分。
2025年06月13日
文件扩展名(filename extension)也称为文件的后缀名,是操作系统用来标记文件类型的一种机制,在Windows系统下,扩展名还可以告诉操作系统默认用什么软件打开文件。通常来说,一个扩展名是跟在主文件名后面的,由一个分隔符(英文句号)分隔。扩展名可以被认为是一个类型的元数据。
博客园:小黑电脑,版权归原作者所有,
https://xiaoheidiannao.com/articles/Extension-Name.html
2025年06月13日
在安装 PHP扩展的时候,会用到一个命令make,在一些文章介绍里会这样说,如果要用编译安装的话就执行make,make install以后就会把代码编译成so文件,然后更改php.ini把extensiion加上这个so的地址,这个扩展就安装完成了,这个make倒底起什么用?
2025年06月13日
Android手表的“潜力”可谓十分惊人,比如前不久一位17岁的Geek展示了在三星的Gear Live上运行苹果Macintosh II的System 6系统,虽然操作费力,但称得上可用。
最近,另一名“少年英才”Dave将经典的Windows XP移植到了屏幕只有1.65寸的LG G Watch上。
Dave介绍说,他使用的是一个仅有100MB的精简版XP系统,虽然可以看到完整的开机画面,但是桌面却空空如也,只有一个“CMD”窗口,不过鼠标指针倒是可以通过触控来操作。