【Cangjie】仓颉编程语言学习03——控制流表达式_A篇

(仓颉) 仓颉语言入门 仓颉-鸿蒙原生应用编程语言-华为开发者联盟 (huawei.com)初识仓颉语言-仓颉编程语言开发指南-学习仓颉语言 - 华为HarmonyOS开发者 (huawei.com)【原创】仓颉编程语言入门教程楼主作为主语言C++,副语言python。仅做基础的入门了解。本文不做任何格外的语法说明,仅在代码中用简短的注释辅助。下文均为教学视频中的实例demo(上方的视频也出现在官网的视频一栏中)。本文所有代码均在下方的在线编译器中进行尝试。除了最后两章,9,10无法进行单文件操作其余均有验证。 阅读详情

本章节同样分为了A、B篇,B篇内容相对较少。B篇也同样是在以后再出,因此看完本章A篇后且完成了代码练习后,就可以直接跳到 C篇,后面笔者会提醒读者回来看本章B篇(前提是我写好了)。

本章节的内容相当实用,学完本章的内容,就能搭建出一个比较完整的程序框架了,包括实现第一章所提出的问题。而且本章学完之后,应该就可以写几个小项目了(代码量很快就可以上来了)。

关于本篇的内容,其实不建议有其他语言基础的读者直接跳过,因为笔者对本篇内容的解析可能会给你提供了一个全新的、基础的角度理解一个语言的语法。对于0基础读者,本篇一定要通读看完,看不懂的可以评论区交流,因为本篇的内容很基础,最起码在学习的时候要能抽象理解。


还记得仓颉中表达式得概念吗?凡是可求值的语言元素都是表达式。

本章节主要介绍仓颉中重要的几个表达式,分为两类:条件表达式和循环表达式。

任何一段程序的执行流程,只会涉及三种基本结构——顺序结构、分支结构和循环结构。实际上,分支结构和循环结构,是由某些指令控制当前顺序执行流产生跳转而得到的,它们让程序能够表达更复杂的逻辑,在仓颉中,这种用来控制执行流的语言元素就是条件表达式和循环表达式。

 这些表达式会依附一个大括号"{}",里面包围一组表达式,仓颉称之为代码块。它将作为程序的一个顺序执行流,其中的表达式将按编码顺序依次执行。如果代码块中有至少一个表达式,我们规定此代码块的值与类型等于其中最后一个表达式的值与类型,如果代码块中没有表达式,规定这种空代码块的类型为 Unit、值为 ()。

注意:代码块本身不是一个表达式,不能被单独使用。

一、分支表达式

条件表达式分为 if 表达式和 if-let 表达式两种,它们的值与类型需要根据使用场景来确定。

 if-let 表达式会在 B 篇中介绍,因为它与模式匹配有关。

if 表达式

if 表达式的基本形式为:

if (条件) {
  分支 1
} else {
  分支 2
}

其中“条件”是布尔类型表达式,“分支 1”和“分支 2”是两个代码块。if 表达式将按如下规则执行:

  1. 计算“条件”表达式,如果值为 true 则转到第 2 步,值为 false 则转到第 3 步。
  2. 执行“分支 1”,转到第 4 步。
  3. 执行“分支 2”,转到第 4 步。
  4. 继续执行 if 表达式后面的代码。

在一些场景中,我们可能只关注条件成立时该做些什么,所以 else 和对应的代码块是允许省略的。

    let number : Int64 = 128
    println(number)
    if (number < 0){
        print("number 值小于 0")
    }

    if (number % 2 == 0) {
        println("偶数")
    } else {
        println("奇数")
    }

    

仓颉编程语言是强类型的,if 表达式的条件只能是布尔类型,不能使用整数或浮点数等类型,和 C 语言等不同,仓颉不以条件取值是否为 0 作为分支选择依据。(这一点有其他语言基础的读者要注意了)

在许多场景中,当一个条件不成立时,我们可能还要判断另一个或多个条件、再执行对应的动作,仓颉允许在 else 之后跟随新的 if 表达式,由此支持多级条件判断和分支执行,例如:

    let speed :Float64 = 8.2
    println("${speed} km/s")
    if (speed > 16.7) {
        println("第三宇宙速度,鹊桥相会")
    } else if (speed > 11.2) {
        println("第二宇宙速度,嫦娥奔月")
    } else if (speed > 7.9) {
        println("第一宇宙速度,腾云驾雾")
    } else {
        println("脚踏实地,仰望星空")
    }

(一)、if 表达式的求值

if 表达式要分为两种,一种是 含 else 分支的 if 表达式,一种是 不含 else 分支的 if 表达式。

先说后者。因为 if 分支的代码块可能不被执行,所以规定这类 不含 else 分支的 if 表达式的类型为 Unit,值为 ()

关于含 else 分支的 if 表达式,它需要分两种情况,一种是需要对其求值,一种是不关心它的求值。

如果我们不关心它的求值(前面写的两个代码就是不关心它的求值),仓颉规定这种场景下的 if 表达式类型为 Unit、值为 (),且各分支不参与上述类型检查。(一会做解释)

当我们需要对其求值时,有两个需要注意的地方:

  • 如果上下文明确要求值类型为 T,则 if 表达式各分支代码块的类型必须是 T 的子类型,这时 if 表达式的类型被确定为 T,如果不满足子类型约束,编译会报错。
  • 如果上下文没有明确的类型要求,则 if 表达式的类型是其各分支代码块类型的最小公共父类型,如果最小公共父类型不存在,编译会报错。

看代码抽象理解:

    var condition : Int = 1 // Int 是 Int64 的别名 等价于 Int64

    var a : Int64 = 32
    let b : Array<Int64> = [1, 2, 3]
    var c : Int64 = 64
    var d : String = "hello cangjie"

    // 没有 else 分支的 if 表达式  类型为 Unit、值为 ()
    let ret1 : String = "${if (condition == 1) { a }}"

    // 有 else 分支的 if 表达式,但不关心求值结果
    if (condition == 1) 
    { 
        a=32 // 分支代码块不参与类型检查。 (不过实际 赋值表达式类型为 Unit 可回顾上章节内容)
    } else {
        a // 分支代码块不参与类型检查。 (不过实际 类型为 Int64)
    } 

    // 有 else 分支 的 if 表达式 且上下文明确要求值类型为 Int64
    // 如果有一个分支 改变了类型都会报错,比如:去掉a 或 把它注释
    let ret3 : Int64 =  if (condition == 1) 
                        { 
                            a // 分支代码块类型为 Int64 
                        } else { 
                            c // 分支代码块类型为 Int64
                        }

    // 有 else 分支的 if 表达式,但上下文不明确要求值类型,
    // 表达式类型是其 各分支代码块类型的最小公共父类型
    let ret4 =  if (condition == 1) 
                { 
                    a   // 不影响此分支代码块 类型
                    d  // 类型为 String 最小公共父类型是 ToString
                } else { 
                    b // 类型为 Array<Int64> 最小公共父类型是 ToString
                }
    // 为什么 String 与 Array<Int64> 的最小公共父类型是 ToString,这个学到后面就知道了,不作解释
    
    println("没有 else 分支的 if 表达式求值结果为:${ret1}")
    println("有 else 分支 的 if 表达式 且上下文明确要求值类型为 Int64,结果为:${ret3}")
    println("有 else 分支的 if 表达式,但上下文不明确要求值类型,表达式类型是其 各分支代码块类型的最小公共父类型,结果为:${ret4}")

 其中知识点有些多,慢慢领悟。还有笔者给出的直到现在的代码都是放在 main 后面的代码块中的。

if-else 表达式的求值机制应该是为了替代 C 语言中的 三元运算符(?:),0基础无需理会。

代码在编译构建时,会有警告提示:else分支永不可达或是某个变量未被使用。这些警告不碍事,不是红色报错就不影响程序运行,但如果是以后写项目时,那就尽量黄色警告都要解决了。代码运行结果如下:

做一个练习,写一个程序,判断一个年份是不是属于闰年(能被4整除而不能被100整除或者能被400整除),并打印输出结果。笔者的代码会放到最后面。 

 看下面的成绩分制,写一个程序判断成绩在哪一个等级,并打印输出。

百分制    五级制
90~100    A
80~89    B
70~79    C
60~69    D
0~59    E


二、循环表达式

循环表达式有四种:for-in 表达式、while 表达式、do-while 表达式和 while-let 表达式,它们的类型都是 Unit、值为 ()。其中 while-let 表达式与模式匹配相关,将在 B 篇介绍。

循环表达式在设定上就没 条件表达式复杂了,东西少一些。

1、while 表达式

while 表达式的基本形式为:

while (条件) {
  循环体
}

其中“条件”是布尔类型表达式,“循环体”是一个代码块。while 表达式将按如下规则执行:

  1. 计算“条件”表达式,如果值为 true 则转第 2 步,值为 false 转第 3 步。
  2. 执行“循环体”,转第 1 步。
  3. 结束循环,继续执行 while 表达式后面的代码。

示例,从1加到100的程序(这个代码也要手敲哦,不要直接复制粘贴):

var i : Int = 1
var sum : Int = 0

while (i <= 100){
    sum += i
    i++
}

println("从1加到100结果为${sum}"}

2、do-while 表达式

do-while 表达式的基本形式为:

do {
  循环体
} while (条件)

其中“条件”是布尔类型表达式,“循环体”是一个代码块。do-while 表达式将按如下规则执行:

  1. 执行“循环体”,转第 2 步。
  2. 计算“条件”表达式,如果值为 true 则转第 1 步,值为 false 转第 3 步。
  3. 结束循环,继续执行 do-while 表达式后面的代码。
var i : Int = 1
var sum : Int = 0

do {
    sum += i
    i++
}while (i <= 100)

println("从1加到100结果为${sum}"}

do-while 与 while 表达式的区别是,do-while 至少会执行一次 循环体

3、for-in 表达式

for-in 表达式可以遍历那些扩展了迭代器接口 Iterable<T> 的类型实例(以后我们会学这个扩展的,不用着急)。for-in 表达式的基本形式为:

for (迭代变量 in 序列) {
  循环体
}

其中“循环体”是一个代码块。“迭代变量”是单个标识符或由多个标识符构成的元组,用于绑定每轮遍历中由迭代器指向的数据,可以作为“循环体”中的局部变量使用。“序列”是一个表达式,它只会被计算一次,遍历是针对此表达式的值进行的,其类型必须扩展了迭代器接口 Iterable<T>。for-in 表达式将按如下规则执行:

  1. 计算“序列”表达式,将其值作为遍历对象,并初始化遍历对象的迭代器。
  2. 更新迭代器,如果迭代器终止,转第 4 步,否则转第 3 步。
  3. 将当前迭代器指向的数据与“迭代变量”绑定,并执行“循环体”,转第 2 步。
  4. 结束循环,继续执行 for-in 表达式后面的代码。

在 for-in 表达式的循环体中,不能修改迭代变量。

在之前学的10个基础数据类型中,Array、String、区间类型都 扩展了迭代器接口。

迭代器的抽象含义是什么,先不必领会,先学会如何使用就行,用着用着就明白了。

var name : String = "hello cangjie\n"
for (char in name){
    print(char)
}

 现在由读者写一个循环打印 Array 数组的循环,至于区间后面会有。快练习一下吧。

区间遍历一般这样用多一些:

    var sum = 0
    // let vet : Range<Int64> = 1..=100 // 不会专门手动定义一个区间类型变量
    for (i in 1..=100) {
        sum += i
    }
    println(sum)

还记得说 迭代变量不可修改吗?如果想遍历 Array 并修改其元素的值,可以利用区间遍历:

    let array = [1, 2, 3, 4]
    for (i in 0..array.size){
        array[i] = 0
    }

以上的代码是完全合法的,但如果我们试图修改 迭代变量 i 的值,就是非法的,编译器会报错。

a. 使用通配符 _ 代替迭代变量

在一些应用场景中,只需要循环执行某些操作,但并不使用迭代变量,这时可以使用通配符 _ 代替迭代变量,例如:

main() {
    var number = 2
    for (_ in 0..5) {
        number *= number
    }
    println(number)
}

 通配符 _ 的使用场景是,如示例代码,不需要使用迭代变量,单纯需要循环指定次数时,这样用就可以了。

b. where 条件

在部分循环遍历场景中,对于特定取值的迭代变量,可能需要直接跳过、进入下一轮循环。仓颉为此提供了更便捷的表达方式——可以在所遍历的“序列”之后用 where 关键字引导一个布尔表达式,这样在每次将进入循环体执行前,会先计算此表达式,如果值为 true 则执行循环体,反之直接进入下一轮循环。例如:

// 把数组中  所有奇数递增变为偶数
var arr : Array<Int64> = [1, 47, 33, 59, 24, 73]
for (i in 0..arr.size where arr[i] % 2 == 1) {
    arr[i]++
}

 注意:有其他语言基础的读者,一定要搞清楚,如果 where 引导的布尔表达式 计算结果为false时,for-in 循环不终止,只是跳过本次循环而已,紧接着就会进入下一次循环。真正主导 for-in 循环终止的条件是,迭代变量 遍历完整个 序列 之后,循环才终止。简而言之,遍历了整个序列之后,循环才终止。

 

4、break 与 continue 表达式

在循环结构的程序中,有时需要根据特定条件提前结束循环或跳过本轮循环,为此仓颉引入了 break 与 continue 表达式,它们可以出现在循环表达式的循环体中。

break 用于终止当前循环表达式的执行、转去执行循环表达式之后的代码,continue 用于提前结束本轮循环、进入下一轮循环。

break 与 continue 表达式的类型都是 Nothing。

例如,以下程序使用 for-in 表达式和 break 表达式,在给定的整数数组中,找到第一个能被 5 整除的数字:

    let numbers = [12, 18, 25, 36, 49, 55]
    for (number in numbers) {
        if (number % 5 == 0) {
            println(number)
            break// 迭代到 第三个元素 下标为2时 执行break表达式,退出 for-in 循环表达式
        }
    }

continue表达式 与 break表达式的用法一致,就交给读者测试了。代码写起来吧,尝试重写 where条件的示例代码,让它使用continue表达式来达到一样的效果。 

5、三个循环表达式的区别

相同:

  • 都能循环执行 循环体中的代码(循环表达式的代码块也称为循环体)
  • 都能使用 break表达式 或 continue表达式

不同:

  • while 表达式 与 do-while 表达式 都由条件主导循环 继续或终止;
    for-in 表达式 由序列的迭代主导循环的终止
  • do-while 表达式 至少执行一次 循环体

练习:

1、还记得第一章的引言吗?现在要求你创建一个数组,数组的元素类型是元组类型,元组有4个元素,分别是 名字,语数英成绩。由你自己初始化它们。分别使用 for-in 表达式遍历打印一次数组的内容;使用 while 表达式遍历一次数组,找出总分最高的学生,打印这个学生的名字与总分。然后再使用一个循环表达式分别计算该班级3科成绩的平均值。

要求:要使用插值字符串打印信息

2、修改上一题求最高分的代码,改为用 if 表达式 的求值语法,比如 :

var max : Int64 = 0
max = if (_本次循环迭代变量的总分 > max) { _本次循环迭代变量的总分 } else { max }

if 表达式 与 else 分支 放在同一行也是合法的,可正常运行。

附录.

1、练习代码

判断一个年份是不是属于闰年

代码有黄色警报,不过没问题。正说明仓颉是安全度高的语言。

    let year : Int = 2025
    var ret : String = "${year} "

    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
        ret += "是闰年"
    }else{
        ret += "不是闰年"
    }
    
    println(ret)

写一个程序判断成绩在哪一个等级.(方法不唯一,主要是想让0基础读者,能回顾更多知识)

    let level_arr : Array<Rune> = [r'A', r'B', r'C', r'D', r'E']
    var i : Int64

    let grade = 78
    if (grade >= 90){
        i = 0
    }else if (grade >= 80){
        i = 1
    }else if (grade >= 70){
        i = 2
    }else if (grade >= 60){
        i = 3
    }else{
        i = 4
    }

    println("成绩 ${grade} 属于等级 ${level_arr[i]}")

还记得第一章的引言吗?现在要求你创建一个数组,数组的元素类型是元组类型,元组有4个元素,分别是 名字,语数英成绩。由你自己初始化它们。分别使用 for-in 表达式遍历打印一次数组的内容;使用 while 表达式遍历一次数组,找出总分最高的学生,打印这个学生的名字与总分。然后再使用一个循环表达式分别计算该班级3科成绩的平均值。

下面是完整的代码:

package study_code


main(): Int64 {
    // 还记得第一章的引言吗?现在要求你创建一个数组,数组的元素类型是元组类型,元组有4个元素,分别是 名字,语数英成绩。由你自己初始化它们。分别使用 for-in 表达式遍历打印一次数组的内容;使用 while 表达式遍历一次数组,找出总分最高的学生,打印这个学生的名字与总分。然后再使用一个循环表达式分别计算该班级3科成绩的平均值。

    let grades : Array<(name : String, grade_Chinese : Float64, grade_Math : Float64, grade_English : Float64)>

    grades = [
        ("小明", 72.0, 98.0, 69.0),
        ("小红", 85.5, 88.0, 91.5),
        ("小刚", 63.0, 75.5, 60.0),
        ("小芳", 92.0, 89.5, 94.0),
        ("小强", 58.5, 61.0, 55.0),
        ("小丽", 87.0, 83.5, 89.0),
        ("小勇", 76.0, 70.5, 73.0),
        ("小倩", 95.5, 93.0, 97.5),
        ("小磊", 68.0, 65.5, 62.0),
        ("小雨", 81.5, 84.0, 80.5)
    ]

    for (it in grades){
        println("${it[0]} 同学:语文:${it[1]}  数学:${it[2]}  英语:${it[3]}")
    }

    // 下面这行代码 有些超纲,不理解没关系,先知道怎么用
    print("\n${Array<Rune>(60, item : r'-')}\n")// 插值表达式 使用构造函数构造一个 Rune数组
    // 构造函数 构造 20个r'-'   r'-' 是 字符字面量,
    // \n 是转义字符,意为 换行符

    var i : Int64 = 0
    // 变量命名要规范  不只是符合标识符的命名规则,更要让程序员一看就知道这个变量的意义是什么
    var max_grade : Float64 = 0.0 // 总分最低分就是 0 分了
    var max_name : String = ""
    while (i < grades.size){ // 下标从 0开始  直到 grades.size - 1  所以是小于,而不是小于等于
        let it = grades[i]  // 这里是引用 grades 数组 的元素,没有写出it的类型了,类型太长了,写太麻烦了
        var tmp_total_grade : Float64 = it[1] + it[2] + it[3] // 元组的 下标0 是 名字
        if (max_grade < tmp_total_grade){// 这里是小于运算,可以直接用  如果是判断两个浮点数 == 相等,就不能直接比较了
            max_grade = tmp_total_grade
            max_name = it[0]
        }

        i++// 注意迭代 条件
    }

    println("总分最高分的同学是 ${max_name}, 总分为 ${max_grade} \n")// 多换一行

    var total_grade_chinese : Float64 = 0.0
    var total_grade_math : Float64 = 0.0
    var total_grade_english : Float64 = 0.0
    for (it in grades){
        // 代码格式整齐总是好的
        total_grade_chinese += it[1]
        total_grade_math    += it[2]
        total_grade_english += it[3]
    }

    var average_grade_chinese : Float64 = total_grade_chinese / Float64(grades.size) // 类型转换  这个超纲了
    var average_grade_math : Float64 = total_grade_math / Float64(grades.size)
    var average_grade_english : Float64 = total_grade_english / Float64(grades.size)

    println("""
        语文平均分:${average_grade_chinese} 
        数学平均分:${average_grade_math}
        英语平均分:${average_grade_english}
        """)


    return 0
}

修改上一题求最高分的代码,改为用 if 表达式 的求值语法:

    var i : Int64 = 0
    // 变量命名要规范  不只是符合标识符的命名规则,更要让程序员一看就知道这个变量的意义是什么
    var max_grade : Float64 = 0.0 // 总分最低分就是 0 分了
    var max_name : String = ""
    while (i < grades.size){ // 下标从 0开始  直到 grades.size - 1  所以是小于,而不是小于等于
        let it = grades[i]  // 这里是引用 grades 数组 的元素,没有写出it的类型了,类型太长了,写太麻烦了
        var tmp_total_grade : Float64 = it[1] + it[2] + it[3] // 元组的 下标0 是 名字

//------------------------------------------------------------
        (max_grade, max_name) = if (max_grade < tmp_total_grade){
                                    (tmp_total_grade, it[0])
                                }else{
                                    (max_grade, max_name)
                                }
//------------------------------------------------------------------

        i++// 注意迭代 条件
    }

Manus通用AI智能体完全使用指南(2025最新版)——从注册到高阶技巧全解析 阅读详情

相关推荐

SAP公司间采购后台配置及前台操作详解

公司间采购后台配置及前台操作详解 SAP 实施中公司间交易几乎每个项目都会有此业务需求,比如内地很多公司都会在香港设置贸易型子公司。通过香港公司接单,然后转内地公司生产,或内地公司通过香港公司采购进口原材料,这些业务必然会涉及到公司间交易,下面我将详细说明下SAP是如何实现这种业务场景的,供大家参考。 配置前必须前台先创建公司间供应商主数据和客户主数据 1. 创建相应的客户主数据 功能说明 公司间...

weixin_40672823的博客 1万+

一文带你入门仓颉编程语言(上)

仓颉编程语言,专为 HarmonyOS 精心打造,它宛如一座桥梁,无缝打通了鸿蒙与欧拉在应用开发生态上的阻碍,为鸿蒙生态基础设施建设添上了画龙点睛的最后一笔。从移动应用、智能穿戴,到智能家居、工业控制,鸿蒙系统广泛的应用场景,对编程语言提出了严苛至极的要求。仓颉编程语言应运而生,承载着满足多样化需求、助力开发者高效创新的重任,已然成为鸿蒙生态蓬勃发展的核心驱动力。

倔强的石头的博客 2万+

仓颉编程语言入门 -- 标识符 , 变量以及数据类型详解

仓颉标识符 , 变量以及数据类型相关概念及其使用详细介绍

几许的博客 2662

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:)

从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed....

qq_40417648的博客 6228

2023华为OD机试真题B卷 Python 实现【最长的元音子串长度】

定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成的子序列称为该字符串的子串

MISAYAONE的博客 902

仓颉编程语言深入教程:基础概念和数据类型

变量和常量是程序的基本组成部分,仓颉语言使用let定义变量,const定义常量。// 定义变量// 定义常量函数通过fn关键字定义,可以有参数和返回值。// 定义一个计算平方的函数// 输出 25本文深入剖析了仓颉编程语言的基础数据类型及其高级用法,并通过代码示例展示了每种类型的实际应用场景。希望读者能够通过本文掌握仓颉语言的核心思想,并在实践中灵活运用,构建高效优雅的应用程序。通过以上步骤,相信你已经初步了解了仓颉编程语言的安装和使用。

2301_80863610的博客 2996

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

华为仓颉编程语言正式发布!相比Java、Go、Swift优势在哪?附入门教程~

在2024年6月21日举行的华为开发者大会上,华为公司不仅对外宣布了其新一代鸿蒙操作系统HarmonyOS NEXT,还正式发布了他们自主研发的编程语言,名为。我们一起看看仓颉编程语言的定位及其优势所在,以及它的入门教程💪仓颉编程语言在开发中力求在安全性、易用性和性能之间找到最佳平衡点。面对无法完美兼顾所有目标的挑战,仓颉选择了一条中间道路,既不是性能至上的系统编程语言,也非开发效率优先的动态脚本语言。它被设计为一种静态类型的语言,具备自动内存管理,专为应用开发而优化。

爱编程的鱼的博客 1万+

SAP物料主数据归档详解(物理删除)

顾问们的回答肯定的统一的不能,只能打上删除标记。物料设置好需要删除的物料号这里我们需要删除的物料是AG88,其中,若不选“考虑无删除标记的物料”,需要将需要归档的物料MM06打删除标记。平时在操作系统过程中经常会不小心创建出很多无用的物料主数据,但是系统只能通过MM06打上删除标记,但是物料最终在系统中还是可以查询到的。6、执行已设置变式的归档程序,执行完毕,点下图中的“Job”,每次执行完归档程序会产生两条作业。然后设置好开始的参数和假脱机的参数,三个都是绿灯就可以执行归档的操作,物理上删除物料主数据。

我小时候很黑的博客 5525

【系统架构设计师-2026上半年真题】案例分析-参考答案及详解(回忆版)

架构评估与设计:通过入侵检测系统的案例分析,阐述质量属性(性能/可用性/安全性/可修改性)的匹配方法,推荐管道-过滤器风格处理实时数据流,并设计8个核心构件实现数据采集到告警的全流程处理。 高并发优化方案: 分析悲观锁(排他锁/共享锁)与乐观锁的特性差异,提出乐观锁通过版本号/CAS实现,悲观锁适用于强一致性场景。 给出Redis优化三手段:分布式锁控制临界资源、Lua脚本保证原子操作、热点数据多级缓存,结合消息队列削峰填谷。 分层架构实践: 智

数据知道的博客 1684

仓颉编程语言:从入门到精通

仓颉这门语言,野心不小。它想在性能、安全、开发爽度这三个点上,找到一个完美的平衡。它吸收了过去这些年编程语言发展的精华,就是为了给未来的软件开发(特别是系统和云原生这块)打个好底子。学仓颉,不光是学个新语言,更是了解一下现在软件开发都在愁啥、有啥新招。现在上车,绝对是早期股东,一起见证它牛逼就完事儿了!

nextera的博客 2863

SQL面试题——最大连续登陆问题

最大连续登陆是我们计算比较常用的指标,我们可以将其当成一个经典的SQL模型,后面我们也会陆续总结出其他的模型,你还知道其他的比较经典的SQL 吗?欢迎分享,或者你还知道其他的关于计算连续的指标?最大连续登陆重要的是计算思想,最大连续才是关键,登陆只是一个场景,要学会举一反三。

9012

【Cangjie】编程语言学习02——仓颉操作符(运算符)_A篇

本文摘要: 这是一篇针对零基础学习者的仓颉编程语言运算符教程,重点讲解了常用运算符和表达式概念。文章详细介绍了算术、位运算、关系、自增/减、赋值、复合赋值和逻辑运算符的使用规则,强调仓颉语言要求二元运算符的操作数类型必须一致。特别指出浮点数比较需用误差范围判断,逻辑运算符具有短路特性,并解释了运算符优先级和结合性的重要性。教程包含大量代码示例和练习建议,附录提供了完整的运算符优先级表和各数据类型支持的运算符列表。建议初学者循序渐进学习,有基础的读者可重点阅读加粗的关键内容。

include_YF_h_的博客 1354

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

我的HarmonyOS实战——鸿蒙系统开发入门学习

1.为什么要学习鸿蒙开发? 开发者的角度: 安卓操作系统连接外部设备时,发现,配对,连接,组合,验证每一步都不能少。连接上了之后才能调用控制第三方设备。换一个设备之后,所有的代码需要重写。所有用安卓也可以连接外部设备并进行控制,但是太过于麻烦。 而且不具备通用性鸿蒙操作系统就解决了这个痛点,设备与设备之间的连接就不需要我们开发者自己去写了,每一个设备都安装上鸿蒙操作系统之后,鸿蒙系统会通过软总线把这些设备都连接在一起。我们在应用开发的时候,只需要写很少的代码可以调用第三方设备,就好像是使用手机本身的设备一样

码农-Vax天道的时间宝藏 1万+

NTscan扫描工具

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

仓颉语言的编译和构建

CJPM(Cangjie Package Manager) 是仓颉语言的官方包管理工具,用来管理、维护仓颉项目的模块系统,并且提供更简易统一的编译入口,支持自定义编译命令。通过包管理器自动依赖管理实现对引入的多版本三方依赖软件进行分析合并,无需开发者担心多版本依赖冲突问题,大大减轻开发者负担;同时提供基于仓颉语言原生的自定义构建机制,允许开发者在构建的不同阶段增加预处理和后处理流程,实现构建流程可灵活定制,能够满足开发者不同业务场景下的编译构建诉求。

程小二的博客 7532

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为仓颉编程语言正式发布,仓颉编程教程

华为在 2024 年 6 月 21 日的华为开发者大会上,华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言,并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。仓颉 | 华为开发者联盟仓颉编程语言文件后缀名为.cj你好,仓颉。lambda表达式可以让函数的创建和使用更加灵活,lambda表达式的值就是一个匿名函数仓颉提供了Exception和Error两个类型,用于描述程序运行时的异常行为开发者可以继承Exception或其子类来自定义异常类,但不能继承Error或其子类。

shixuyong的博客 4406

仓颉编程语言终极上手指南:从零到精通的完整教程

仓颉编程语言作为新一代全场景智能化应用开发语言,正以其独特的架构设计和丰富的生态支持吸引着越来越多的开发者。本指南将带你从环境配置到项目实战,全面掌握仓颉语言的核心使用方法。 ## 🚀 快速启航:环境配置一步到位 ### 系统环境预检 在开始安装之前,建议先检查你的系统环境是否满足基本要求: **系统要求清单:** - 操作系统:Windows 10/11、macOS 10.15+、主流

gitblog_00694的博客 1244

仓颉编程语言入门

五年磨一剑,华为仓颉编程语言正式发布。

程小二的博客 4万+

华为c语言编程规范_华为自主研发编程语言“仓颉”,“中国话”将走向世界...

近日,网上曝光华为自研编程语言名字定为“仓颉”(char),项目已经进行了很久,预计明年会对外公布一些具体细节。什么是编程语言?编程语言就好比我们生活中,父母用汉语命令孩子“去写作业”,这里的汉语就是是编程语言的种类,而“去写作业”这段文字是编程语言的内容,父母就是通过这段“语言”去命令孩子做某件事情。而我们也能通过”语言“来命令计算机,让计算机为我们做事情。就像语言分为汉语,英语等不同种类,编程...

weixin_39524439的博客 1万+

跟我一起学“仓颉”编程语言—操作符

本章为大家详细的介绍了仓颉编程语言中的操作符的内容。

Cool_foolisher的博客 1607

仓颉编程语言 -- 初识(二)

仓颉编程语言 -- 初识(二)

chinusyan的专栏 5284

跟我一起学“仓颉”编程语言—仓颉语言介绍及Hello World

本章为大家详细的介绍了仓颉编程语言的特性、环境安装以及Hello World的内容。

Cool_foolisher的博客 8987

跟我一起学“仓颉”编程语言-Collection高级操作

本章为大家详细的介绍了仓颉编程语言中Collection高级操作的内容。

Cool_foolisher的博客 938

一文带你入门仓颉编程语言:从环境搭建到首个可运行项目

用仓颉VS Code插件配合cjpm三步跑通首个项目:先装SDK与插件并精确配置cangjie路径,再执行cjpm init与cjpm run验证hello world,最后对照常见报错排查。文中还介绍用TaoToken辅助查语法与排错,官网见https://taotoken.net/?utm_source=taotoken_aicg_blog_end。

weixin_42596214的博客 160

仓颉编程入门 -- if 表达式使用详解

其中“条件”是布尔类型表达式,“分支 1”和“分支 2”是两个代码块。在一些场景中,我们可能只关注条件成立时该做些什么,所以 else 和对应的代码块是允许省略的在这段程序中,我们使用仓颉标准库的 random 包生成了一个随机整数,然后使用 if 表达式判断这个整数是否能被 2 整除,并在不同的条件分支中打印“偶数”或“奇数”。注意 : 仓颉编程语言是强类型的,

几许的博客 1152
上一篇: 【Cangjie】编程语言学习02——仓颉操作符(运算符)_A篇
N-PlusPlus
博客等级 码龄5年 85粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值