当前位置: 首页 > news >正文

「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成

本篇将系统介绍Cangjie编程语言中程序的基本组成部分,涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则,帮助开发者理解Cangjie程序的整体结构。


关键词
  • 程序入口点
  • main函数
  • 包与模块
  • 变量类型与作用域
  • 值类型与引用类型
  • 代码结构与规范

一、程序入口点与 main 函数

Cangjie中,main 函数是程序的入口,负责控制程序的启动与结束。

1.1 main 函数的定义
main(): Int64 {// 程序代码return 0
}
  • main 函数返回整数,0 表示正常退出。
1.2 参数与返回值
  • 可选参数 Array 用于命令行输入。
  • 返回类型为整数或 Unit 类型,取决于程序需求。

二、包与模块

模块化编程通过包(package)和模块(module)实现,便于代码逻辑分组与复用。

2.1 定义包

使用 package 关键字定义包,按逻辑组织代码。

package cjcDemo
2.2 导入模块

使用 import 关键字引入其他包中的模块或函数。

import std.math.*

三、程序结构与顶层作用域

Cangjie程序文件扩展名为 .cj,在顶层作用域中可以定义全局变量、全局函数和自定义类型。

3.1 作用域
  1. 全局作用域:允许定义全局变量和自定义类型。
  2. 局部作用域:函数或代码块内部的变量仅在局部范围内有效。
let globalVar = 2023
func globalFunc() {}
struct CustomStruct {}
class CustomClass {}
enum CustomEnum { OptionA | OptionB }main(): Int64 {println(globalVar)return 0
}

输出:

2023
3.2 嵌套作用域

嵌套作用域中可以使用外层作用域的变量;内层同名定义会遮盖外层定义。


四、变量定义与使用

Cangjie变量包含变量名、数据值和属性,属性包括可变性、可见性和静态性。

4.1 变量修饰符
  1. 可变性let 表示不可变,var 表示可变。
  2. 可见性publicprivate 控制变量引用范围。
  3. 静态性static 影响变量的存储和引用方式。

示例:

let a: Int64 = 20
var b: Int64 = 12
b = 23
println("${a} ${b}")

输出:

20 23

五、值类型与引用类型

Cangjie中的数据类型分为值类型和引用类型。基础数据类型和 struct 是值类型,而 classArray 是引用类型。

5.1 值类型与引用类型的差异
  1. 值类型:每个变量都有自己的数据副本,赋值会产生拷贝。
  2. 引用类型:多个变量共享同一数据对象,对一个变量的修改会影响所有引用。

示例:

struct Copy { var data = 2012 }
class Share { var data = 2012 }main(): Int64 {let c1 = Copy()var c2 = c1c2.data = 2023println("${c1.data}, ${c2.data}")let s1 = Share()let s2 = s1s2.data = 2023println("${s1.data}, ${s2.data}")
}

输出:

2012, 2023
2023, 2023

六、代码规范与风格

良好的代码规范有助于提高代码的可读性和可维护性。

6.1 命名规范
  1. 变量名:使用小写字母和下划线。
  2. 函数名:采用驼峰命名法。
  3. 常量名:全大写字母,单词间用下划线分隔。
6.2 缩进与格式
  1. 缩进:统一使用 4 个空格。
  2. 括号与空格:在关键字后加空格,函数调用时不加空格。
  3. 行长度:每行代码不超过 80 个字符,建议长行换行。
6.3 代码注释
  1. 简洁性:注释应言简意赅。
  2. 更新性:确保注释与代码同步更新,避免误导。

七、示例代码解析

以下示例展示了Cangjie程序的基本组成,包括入口函数、变量、函数调用、模块导入等。

package cjcDemoimport std.math.*main(): Int64 {let radius: Float64 = 5.0let area: Float64 = calculateArea(radius)println("圆的半径为: " + radius.toString())println("圆的面积为: " + area.toString())if (area > 50.0) {println("面积大于50")} else {println("面积小于等于50")}return 0
}/* 计算圆的面积 */
func calculateArea(r: Float64): Float64 {let pi = 3.14return pi * r * r
}

输出:

圆的半径为: 5.000000
圆的面积为: 78.500000
面积大于50

小结

本篇详细介绍了Cangjie程序的基本组成,涵盖了 main 函数、包与模块的使用、变量类型与作用域、值与引用类型的概念和代码规范,为编写规范的Cangjie代码奠定了基础。


下篇预告

下一篇将进入Cangjie数据类型的详细解析,首先简述 10种基础数据类型,敬请关注 「Mac上学习仓颉22」基础篇2 - 基础数据类型简述


上一篇: 「Mac上学习仓颉20」PTA刷题篇11 - L1-011 A-B
下一篇: 「Mac上学习仓颉22」基础篇2 - 基础数据类型简述

作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=195
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


相关文章:

「Mac玩转仓颉内测版21」基础篇1 - 仓颉程序的基本组成

本篇将系统介绍Cangjie编程语言中程序的基本组成部分,涵盖 main 函数的定义、包与模块的使用、变量类型、作用域和代码结构原则,帮助开发者理解Cangjie程序的整体结构。 关键词 程序入口点main函数包与模块变量类型与作用域值类型与引用类型代码结构与规…...

【Linux网络编程】简单的UDP套接字

目录 一,socket编程的相关说明 1-1,sockaddr结构体 1-2,Socket API 二,基于Udp协议的简单通信 三,UDP套接字的应用 3-1,实现英译汉字典 一,socket编程的相关说明 Socket编程是一种网络通信…...

在Vue中使用Excalidraw实现在线画板

概述 Excalidraw是一个非常好用的画图板工具,但是是用React写的,本文分享一种在Vue项目中使用的方法。 效果 实现 Excalidraw简介 这篇文章(Excalidraw 完美的绘图工具:https://zhuanlan.zhihu.com/p/684940131)介绍的很全面,…...

游戏+AI的发展历程,AI技术在游戏行业的应用有哪些?

人工智能(AI)与游戏的结合,不仅是技术进步的体现,更是人类智慧的延伸。从最初的简单规则到如今的复杂决策系统,AI在游戏领域的发展历史可谓波澜壮阔。 早在2001年,就有研究指出游戏人工智能领域&#xff0…...

Methode Electronics EDI 需求分析

Methode Electronics 是一家总部位于美国的全球性技术公司,专注于设计和制造用于多个行业的电子和电气组件,产品涵盖汽车、工业、电信、医疗设备以及消费电子等多个领域,提供创新的解决方案。 填写Methode_EDI_Parameters_Template Methode_…...

2023AE软件、Adobe After Effects安装步骤分享教程

2023AE软件是一款由Adobe公司开发的视频编辑软件,也被称为Adobe After Effects。它在广告、电影、电视和网络视频等领域广泛应用,用于制作动态图形、特效、合成和其他视觉效果。该软件支持多种视频和音频文件格式,具有丰富的插件和预设&#…...

【前端】JavaScript 变量引用、内存与数组赋值:深入解析三种情景

博客主页: [小ᶻZ࿆] 本文专栏: 前端 文章目录 💯前言💯场景一:直接赋值与重新引用为什么结果不是 [3, 4, 5]?1. 引用与赋值的基本概念2. 图示分析 关键总结 💯场景二:引用指向的变化为什么…...

本地项目运行提示跨域问题

项目背景:我使用phpwebstudy在本地搭建了一个项目,然后前端是http://localhost:8080/ 后端我直接创建了一个本地域名,例如www.abc.com 然后vue.config.js配置如下,这个配置在我所有线上环境是没有任何问题的 devServer: {proxy…...

C++ —— string类(上)

目录 string的介绍 string类功能的使用介绍 constructor —— 构造 介绍使用(1)(2)(4) :构造、拷贝构造、带参构造 介绍(3):拷贝string类对象的一部分字符…...

React Native Mac 环境搭建

下载 Mac 版Android Studio 下载 安装 JDK 环境 Flutter 项目实战-环境变量配置一 安装 Node.js 方式一 通过Node.js 官网下载 下载完成后点击安装包进行安装 安装完成...

Python Web 开发的路径管理艺术:FastAPI 项目中的最佳实践与问题解析20241119

Python Web 开发的路径管理艺术:FastAPI 项目中的最佳实践与问题解析 引言:从路径错误到模块化管理的技术旅程 在现代 Python Web 开发中,路径管理是一个常常被忽视却非常重要的问题。尤其是在使用像 FastAPI 和 Tortoise ORM 这样的框架时…...

Rust derive macro(Rust #[derive])Rust派生宏

参考文章:附录 D:派生特征 trait 文章目录 Rust 中的派生宏 #[derive]基础使用示例:派生 Debug 派生其他常用特征示例:派生 Clone 和 Copy 派生宏的限制和自定义派生自定义派生宏上面代码运行时报错了,以下是解释 结论…...

springboot嗨玩旅游网站

摘 要 嗨玩旅游网站是一个专为旅行爱好者打造的在线平台。我们提供丰富多样的旅游目的地信息,包括景点信息、旅游线路、商品信息、社区信息、活动推广等,帮助用户轻松规划行程。嗨玩旅游网站致力于为用户提供便捷、实用的旅行服务,让每一次旅…...

杰发科技AC7840——EEP中RAM的配置

sample和手册中示例代码的sram区地址定义不一样 这个在RAM中使用没有限制,根据这个表格留下足够空间即可 比如需要4096字节的eep空间,可以把RAM的地址改成E000,即E000-EFFF,共4096bytes即可。...

从零开始的c++之旅——map_set的使用

1.序列式容器和关联式容器 序列式容器:逻辑结构为线性序列的数据结构,两个位置之间没有紧密的关系,比如两者交换一下还是序列式的容器,例如string,vector,deque,array等。 关联式容器&#xff1…...

Docker中的一些常用命令

find / -type f -name “文件名” 2>/dev/null 寻找所有目录中的这个文件 pwd 查看当前目录的地址 docker pull 镜像名 强制拉镜像 docker run 运行docker systemctl daemon-reload 关闭docker systemctl start docker 启动docker systemctl restart docker 重启docker /…...

自存 sql常见语句和实际应用

关于连表 查询两个表 SELECT * FROM study_article JOIN study_article_review 查询的就是两个表相乘,结果为两个表的笛卡尔积 相这样 这种并不是我们想要的结果 通常会添加一些查询条件 SELECT * FROM study_articleJOIN study_article_review ON study_art…...

python | argparse模块在命令行的使用中的重要作用

import argparseclass TestCases:def __init__(self, nameNone, expect_resultNone):self.name nameself.expect expect_resultself.parser argparse.ArgumentParser() # 创建命令解析器self.add_arguments() # 方法 : 添加命令self.args, _ self.parser.par…...

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得,实验需求为: 1.R5作为ISP:其上只能配置IP地址;R4作为企业边界路由器,出口公网地址需要通过PPP协议获取,并进行CHAP认证。(PS:因PPP协议尚未学习&#…...

PW系列工控电脑复制机:效率与精度双重提升

工控电脑复制应用:效率与精度的双重提升 随着现代企业对大数据、数据备份、和跨平台兼容性需求的快速增长,工控电脑已成为数据密集型产业的核心设备。针对工控环境中大量数据复制的特殊需求,PW系列NVMe/SATA PCIe SSD复制机(如PW…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...