「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
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙多线程开发——线程间数据通信对象03(sendable)

1、简 介 在传统JS引擎上,对象的并发通信开销的优化方式只有一种,就是把实现下沉到Native侧,通过Transferable对象的转移或共享方式降低并发通信开销。而开发者仍然还有大量对象并发通信的诉求,这个问题在业界的JS引擎实现上并没…

OpenHarmony-3.驱动HDF

OpenHarmony HDF 框架 1.OpenHarmony HDF 框架概述 OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

[C/C++][FFmpeg] 关于avcodec_send_frame(encoder_ctx, NULL) 的解释

使用FFmpeg,明明看起来已经写完文件了,但是临近末尾还要执行下面这段 // 刷新编码器 avcodec_send_frame(encoder_ctx, NULL); while (avcodec_receive_packet(encoder_ctx, packet) > 0) {av_interleaved_write_frame(output_format_ctx, packet);a…

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名,…

神经网络(系统性学习一):入门篇——简介、发展历程、应用领域、基本概念、超参数调优、网络类型分类

相关文章: 神经网络中常用的激活函数 神经网络简介 神经网络(Neural Networks)是受生物神经系统启发而设计的数学模型,用于模拟人类大脑处理信息的方式。它由大量的节点(或称为“神经元”)组成&#xff0…

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 (一)直观性的理解 (二)缓存区的好处 二、经典案例分析体会 (一)文件读写流(File I/O Buffering) BufferedOutputStream 和 BufferedWriter 可以加快…

SpringBoot 集成 html2Pdf

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…

MySQL Join 的原理与优化实践

文章目录 引言一、基础准备&#xff1a;创建环境与示例数据1. 初始化示例表2. 示例 Join 查询3. EXPLAIN 输出分析 二、MySQL Join 的核心算法与执行机制1. 三种 Join 算法的实现与原理1.1 Index Nested-Loop Join&#xff08;INLJ&#xff09;1.2 Simple Nested-Loop Join&…

阿里Qwen系列开源模型介绍

模型种类丰富 Qwen2&#xff1a;包含Qwen2-0.5b、Qwen2-1.5b、Qwen2-7b、Qwen2-57b-a14b以及Qwen2-72b等五种规模的预训练和指令微调模型&#xff0c;其在多语言处理、长文本处理、代码生成、数学和逻辑推理等能力上&#xff0c;在mmlu、gpqa、humaneval等国际测评中得到了验证…

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

【042A】基于51单片机门禁系统【Proteus仿真+Keil程序+报告+原理图】

☆、设计硬件组成&#xff1a;51单片机最小系统RFID读卡器继电器蜂鸣器LED灯。 1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片&#xff1b; 2、通过RC522读卡器读取IC卡信息&#xff0c;信息匹配继电器吸合门锁打开&#xff1b; 3、可通过上位机对IC卡进行注…

如何重命名 Conda 环境 - 详细教程

如何重命名 Conda 环境 - 详细教程 前言重命名步骤1. 克隆现有环境2. 验证新环境3. 删除旧环境 实例演示注意事项常见问题解答Q1: 为什么 Conda 没有直接的重命名命令&#xff1f;Q2: 重命名过程会影响环境中的包吗&#xff1f;Q3: 如果克隆过程中断&#xff0c;会怎么样&#…

DevOps 之 CI/CD入门操作 (二)

CI/CD简介 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 一、CI流程 1.1 新建项目 新建一个简单的springboot项目 写一个简单的Controller 运行测…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…

第144场双周赛题解:移除石头游戏

移除石头游戏 1、题目描述 Alice 和 Bob 在玩一个游戏&#xff0c;他们俩轮流从一堆石头中移除石头&#xff0c;Alice 先进行操作。 Alice 在第一次操作中移除 恰好 10 个石头。接下来的每次操作中&#xff0c;每位玩家移除的石头数 恰好 为另一位玩家上一次操作的石头数减 …

AWS 新加坡EC2 VPS 性能、线路评测及免费注意事项

原文论坛给你更好的阅读讨论体验&#x1f490;&#xff1a; AWS 新加坡EC2 VPS 性能、线路评测及免费注意事项 - VPS - 波波论坛 引言 对于那些习惯薅“羊毛”的朋友来说&#xff0c; AWS 的 免费套餐 可能已经非常熟悉。这台vps是我用外币卡薅的免费的12个月的机器&#xf…

TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型

TritonServer中加载模型,并在Gunicorn上启动Web服务调用模型 一、TritonServer中加载模型1.1 搭建本地仓库1.2 配置文件1.3 服务端代码1.4 启动TritonServer二、Gunicorn上启动Web服务2.1 安装和配置Gunicorn2.2 启动Gunicorn三、调用模型四、性能优化与监控五、总结在深度学习…

深挖`React`里程碑之作`AutoStore`与`helux`的渊源

自2023/11开始&#xff0c;经过超500commits的开发,以近日正式发布里程碑之作AutoStore AutoStore是一款设计精巧而优雅的现代化响应式状态管理库&#xff0c;提供了强大的状态管理能力&#xff0c;支持响应式、计算属性、异步计算、表单双向绑定、信号组件等功能,为您提供一站…

《AI大模型开发笔记》——Prompt提示词最佳实践

为什么需要提示词优化 什么是 Prompt enginnering&#xff1f; 提示词&#xff1a;解释一下什么是大语言模型的Prompt enginnering 图1. 什么是Prompt Enginnering&#xff1f; 通过上面ChatGPT的说明&#xff0c;我们可以看到&#xff0c;prompt工程化就是如何写prompt提示…