国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令

這篇具有很好參考價值的文章主要介紹了.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言:

經(jīng)過前面幾篇的學(xué)習(xí),我們了解到指令的大概分類,如:

參數(shù)加載指令,該加載指令以?Ld 開頭,將參數(shù)加載到棧中,以便于后續(xù)執(zhí)行操作命令。

參數(shù)存儲指令,其指令以 St 開頭,將棧中的數(shù)據(jù),存儲到指定的變量中,以方便后續(xù)使用。

創(chuàng)建實例指令,其指令以 New 開頭,用于在運(yùn)行時動態(tài)生成并初始化對象。

方法調(diào)用指令,該指令以 Call?開頭,用于在運(yùn)行時調(diào)用其它方法。

本篇介紹分支條件指令,該指令通常以?Br、或 B、C 開頭,用于在運(yùn)行分支條件時跳轉(zhuǎn)指令。

分支條件指令介紹:

分支條件指令是在.NET Emit編程中關(guān)鍵的控制流程工具,用于在IL代碼中實現(xiàn)條件判斷和控制轉(zhuǎn)移。

ILGenerator 類提供了一系列方法,用于生成這些分支條件指令,包括條件分支、無條件分支和Switch分支等。

條件分支指令(如brtrue和brfalse)根據(jù)棧頂?shù)牟紶栔禌Q定是否跳轉(zhuǎn)到目標(biāo)標(biāo)簽,而無條件分支指令(如br)則總是進(jìn)行跳轉(zhuǎn)。

Switch分支指令則用于在多個目標(biāo)中選擇一個跳轉(zhuǎn)。

通過比較指令(如ceq、cgt和clt),還可以進(jìn)行數(shù)值比較并根據(jù)比較結(jié)果執(zhí)行相應(yīng)的跳轉(zhuǎn)操作。

這些指令的靈活運(yùn)用可以實現(xiàn)復(fù)雜的控制邏輯,例如條件判斷、循環(huán)和異常處理等。

深入理解分支條件指令將幫助開發(fā)者更好地掌握.NET Emit編程,提高代碼生成的效率和靈活性。

常用分支條件指令:

條件跳轉(zhuǎn)指令:

  1. beq:如果兩個值相等,則跳轉(zhuǎn)到指定的標(biāo)簽。
  2. bge:如果第一個值大于或等于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽。
  3. bgt:如果第一個值大于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽。
  4. ble:如果第一個值小于或等于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽。
  5. blt:如果第一個值小于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽.
  6. bne.un:如果兩個無符號整數(shù)值不相等,則跳轉(zhuǎn)到指定的標(biāo)簽。
  7. brtrue:如果值為 true,則跳轉(zhuǎn)到指定的標(biāo)簽。
  8. brfalse:如果值為 false,則跳轉(zhuǎn)到指定的標(biāo)簽。
  9. brtrue.s:如果值為 true,則跳轉(zhuǎn)到指定的標(biāo)簽(短格式)。
  10. brfalse.s:如果值為 false,則跳轉(zhuǎn)到指定的標(biāo)簽(短格式).

無條件跳轉(zhuǎn)指令:

  1. br:無條件跳轉(zhuǎn)到指定的標(biāo)簽。
  2. br.s:短格式的無條件跳轉(zhuǎn)到指定的標(biāo)簽。
  3. leave:無條件跳轉(zhuǎn)到 try、filter 或 finally 塊的末尾。
  4. leave.s:短格式的無條件跳轉(zhuǎn)到 try、filter 或 finally 塊的末尾.

比較跳轉(zhuǎn)指令:

  1. bgt.un:如果第一個無符號整數(shù)值大于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽。
  2. bge.un:如果第一個無符號整數(shù)值大于或等于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽。
  3. blt.un:如果第一個無符號整數(shù)值小于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽。
  4. ble.un:如果第一個無符號整數(shù)值小于或等于第二個值,則跳轉(zhuǎn)到指定的標(biāo)簽.

其他跳轉(zhuǎn)指令:

  1. switch:根據(jù)給定的索引值跳轉(zhuǎn)到不同的標(biāo)簽。
  2. brnull:如果值為 null,則跳轉(zhuǎn)到指定的標(biāo)簽。
  3. brinst:如果對象是類的實例,則跳轉(zhuǎn)到指定的標(biāo)簽。

這些指令可以幫助控制流程,在特定條件下跳轉(zhuǎn)到指定的標(biāo)簽位置執(zhí)行相應(yīng)的代碼。

從以上分類說明可以看出,該指令需要配置標(biāo)簽使用,對于標(biāo)簽的用法,

如有遺忘,可以回去補(bǔ)一下文章:.NET Emit 入門教程:第六部分:IL 指令:2:詳解 ILGenerator 輔助方法

上面指令按使用方式,只分兩種:

1、條件跳轉(zhuǎn)指令:根據(jù)棧頂?shù)臄?shù)據(jù),及指令的判斷條件,來跳轉(zhuǎn)標(biāo)簽。

2、Switch 分支跳轉(zhuǎn)指令:根據(jù)給定的索引值,來跳轉(zhuǎn)標(biāo)簽。

1、條件跳轉(zhuǎn)指令:

條件分支指令是在IL代碼中用于根據(jù)條件來執(zhí)行跳轉(zhuǎn)操作的指令。

它們可以根據(jù)棧頂?shù)模ú紶枺┲?/strong>來決定是否跳轉(zhuǎn)到目標(biāo)標(biāo)簽:

示例指令:Brtrue

.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令

示例指令:Brfalse

.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令

該 true、false?指令,除了 bool 值,還兼容判斷了空(引用)和數(shù)字(零),這個小細(xì)節(jié)要注意。?

示例指令:Br

.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令

示例代碼:

var dynamicMethod = new DynamicMethod("WriteAOrB", typeof(void), new Type[] { typeof(bool) }, typeof(AssMethodIL_Condition));

ILGenerator il = dynamicMethod.GetILGenerator();

var labelEnd = il.DefineLabel();
var labelFalse = il.DefineLabel();

il.Emit(OpCodes.Ldarg_0);

il.Emit(OpCodes.Brfalse_S, labelFalse);

il.EmitWriteLine("true.");
il.Emit(OpCodes.Br_S, labelEnd);


il.MarkLabel(labelFalse);
il.EmitWriteLine("false");


il.MarkLabel(labelEnd);
il.Emit(OpCodes.Ret);     // 返回該值

運(yùn)行結(jié)果:

.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令

說明:

1、在 true、false 指令中,通常只會使用其中一個。 

2、在分支條件中,很多時候需要配合 Br 無條件指令跳出分支。

3、在定義標(biāo)簽時,除了定義分支標(biāo)簽,還要定義結(jié)束標(biāo)簽,以便 Br 無條件指令的跳出。 

4、其它條件指令的使用,和bool條件指令的使用是一樣的,只需要理解指令的含義即可。

2、Switch?分支條件指令:

Switch 分支指令用于在多個目標(biāo)中選擇一個跳轉(zhuǎn),類似于在高級編程語言中的 switch 或者 case 語句。

在IL代碼中,Switch 指令可以實現(xiàn)根據(jù)一個整數(shù)值來決定跳轉(zhuǎn)到不同的目標(biāo)標(biāo)簽。Switch 分支指令的主要指令是 switch,其作用如下:

  • switch:?該指令從標(biāo)簽數(shù)組中選擇一個目標(biāo)標(biāo)簽進(jìn)行跳轉(zhuǎn)。在 IL 代碼中,標(biāo)簽數(shù)組通常在 switch 指令之前被定義,并且 switch 指令的操作數(shù)是標(biāo)簽數(shù)組的引用。switch 指令會從操作數(shù)指定的標(biāo)簽數(shù)組中根據(jù)整數(shù)值索引來選擇目標(biāo)標(biāo)簽,然后執(zhí)行跳轉(zhuǎn)操作。

Switch 分支指令的作用是根據(jù)一個整數(shù)值來決定跳轉(zhuǎn)到不同的目標(biāo)標(biāo)簽,這在處理具有多個選擇的情況下非常有用,可以使得代碼更加簡潔和高效。

注意事項:

1、該 Switch?指令只是類似 switch?編程,但不等同。?

2、該 Switch?指令只能根據(jù)索引進(jìn)行指令跳轉(zhuǎn)。

同時,Switch?指令在IL代碼編寫起來,會相對復(fù)雜一點(diǎn),特別是 case 一多,寫起來可會要你命3000.

為了區(qū)分 Switch?指令和我們編寫代碼時的指令 Switch case?區(qū)別,我們來看以下示例:

這一次我們反過來,先寫 C# 代碼,再看它生成的 IL 代碼。

下面給一個示例代碼1:

static void TestString(string c)
{
    switch(c)
    {
        case "a":
            Console.WriteLine("A");break;
        case "b":
            Console.WriteLine("B");break;
        default:
            Console.WriteLine("C");break;
    }
}

反編繹,看生成的 IL?代碼:

.method private hidebysig static 
        void TestString (
            string c
        ) cil managed 
    {
        // Method begins at RVA 0x3808
        // Code size 73 (0x49)
        .maxstack 2
        .locals init (
            [0] string,
            [1] string
        )

        IL_0000: nop
        IL_0001: ldarg.0
        IL_0002: stloc.1
        IL_0003: ldloc.1
        IL_0004: stloc.0
        IL_0005: ldloc.0
        IL_0006: ldstr "a"
        IL_000b: call bool [mscorlib]System.String::op_Equality(string, string)
        IL_0010: brtrue.s IL_0021

        IL_0012: ldloc.0
        IL_0013: ldstr "b"
        IL_0018: call bool [mscorlib]System.String::op_Equality(string, string)
        IL_001d: brtrue.s IL_002e

        IL_001f: br.s IL_003b

        IL_0021: ldstr "A"
        IL_0026: call void [mscorlib]System.Console::WriteLine(string)
        IL_002b: nop
        IL_002c: br.s IL_0048

        IL_002e: ldstr "B"
        IL_0033: call void [mscorlib]System.Console::WriteLine(string)
        IL_0038: nop
        IL_0039: br.s IL_0048

        IL_003b: ldstr "C"
        IL_0040: call void [mscorlib]System.Console::WriteLine(string)
        IL_0045: nop
        IL_0046: br.s IL_0048

        IL_0048: ret
    } // end of method Program::TestString

從該生成的 IL?代碼中,可以看出并沒有 Switch 指令,而是常規(guī)調(diào)用字符串比較后,用 bool 條件指令進(jìn)行跳轉(zhuǎn)。

那是不是用數(shù)字類型就會得到 Switch?指令呢?

再用數(shù)字型來一次:

        static void TestInt(int c)
        {
            switch (c)
            {
                case 1:
                    Console.WriteLine("AAA"); break;
                case 2:
                    Console.WriteLine("BBB"); break;
                default:
                    Console.WriteLine("CCC"); break;
            }
        }

得到的 IL?代碼如下:

.method private hidebysig static 
        void TestInt (
            int32 c
        ) cil managed 
    {
        // Method begins at RVA 0x3860
        // Code size 57 (0x39)
        .maxstack 2
        .locals init (
            [0] int32,
            [1] int32
        )

        IL_0000: nop
        IL_0001: ldarg.0
        IL_0002: stloc.1
        IL_0003: ldloc.1
        IL_0004: stloc.0
        IL_0005: ldloc.0
        IL_0006: ldc.i4.1
        IL_0007: beq.s IL_0011

        IL_0009: br.s IL_000b

        IL_000b: ldloc.0
        IL_000c: ldc.i4.2
        IL_000d: beq.s IL_001e

        IL_000f: br.s IL_002b

        IL_0011: ldstr "AAA"
        IL_0016: call void [mscorlib]System.Console::WriteLine(string)
        IL_001b: nop
        IL_001c: br.s IL_0038

        IL_001e: ldstr "BBB"
        IL_0023: call void [mscorlib]System.Console::WriteLine(string)
        IL_0028: nop
        IL_0029: br.s IL_0038

        IL_002b: ldstr "CCC"
        IL_0030: call void [mscorlib]System.Console::WriteLine(string)
        IL_0035: nop
        IL_0036: br.s IL_0038

        IL_0038: ret
    } // end of method Program::TestInt

依舊是 br?跳轉(zhuǎn)指令。

再試一下用枚舉呢?

        static void TestEnum(DataAccessKind c)
        {
            switch (c)
            {
                case  DataAccessKind.Read:
                    Console.WriteLine("AAA"); break;
                case DataAccessKind.None:
                    Console.WriteLine("BBB"); break;
                default:
                    Console.WriteLine("CCC"); break;
            }
        }

得到?IL?代碼如下:

.method private hidebysig static 
        void TestEnum (
            valuetype [System.Data]Microsoft.SqlServer.Server.DataAccessKind c
        ) cil managed 
    {
        // Method begins at RVA 0x38a8
        // Code size 56 (0x38)
        .maxstack 2
        .locals init (
            [0] valuetype [System.Data]Microsoft.SqlServer.Server.DataAccessKind,
            [1] valuetype [System.Data]Microsoft.SqlServer.Server.DataAccessKind
        )

        IL_0000: nop
        IL_0001: ldarg.0
        IL_0002: stloc.1
        IL_0003: ldloc.1
        IL_0004: stloc.0
        IL_0005: ldloc.0
        IL_0006: brfalse.s IL_001d

        IL_0008: br.s IL_000a

        IL_000a: ldloc.0
        IL_000b: ldc.i4.1
        IL_000c: beq.s IL_0010

        IL_000e: br.s IL_002a

        IL_0010: ldstr "AAA"
        IL_0015: call void [mscorlib]System.Console::WriteLine(string)
        IL_001a: nop
        IL_001b: br.s IL_0037

        IL_001d: ldstr "BBB"
        IL_0022: call void [mscorlib]System.Console::WriteLine(string)
        IL_0027: nop
        IL_0028: br.s IL_0037

        IL_002a: ldstr "CCC"
        IL_002f: call void [mscorlib]System.Console::WriteLine(string)
        IL_0034: nop
        IL_0035: br.s IL_0037

        IL_0037: ret
    } // end of method Program::TestEnum

還是沒有見 Switch?指令。

可見,編程中的Switch,和 IL?的 Switch?指令是不同的。

所以很容易陷入一個誤區(qū),以為代碼用 Switch 寫分支,對應(yīng)的IL就得用 Switch 指令。

下面演示一個用 Switch?指令的示例:

 var dynamicMethod = new DynamicMethod("WriteAOrB", typeof(void), new Type[] { typeof(int) }, typeof(AssMethodIL_Condition));

 ILGenerator il = dynamicMethod.GetILGenerator();

 var labelEnd = il.DefineLabel();

 Label labelIndex_0 = il.DefineLabel();
 Label labelIndex_1 = il.DefineLabel();
 Label labelIndex_2 = il.DefineLabel();
 //BreakOp None=-1,Null=0,Empty=1,NullOrEmpty=2
 var lables = new Label[] { labelIndex_0, labelIndex_1, labelIndex_2 };//0、1、2

 il.Emit(OpCodes.Ldarg_0);

 il.Emit(OpCodes.Switch, lables);

 il.MarkLabel(labelIndex_0);
 il.EmitWriteLine("0.");
 il.Emit(OpCodes.Br_S, labelEnd);

 il.MarkLabel(labelIndex_1);
 il.EmitWriteLine("1.");
 il.Emit(OpCodes.Br_S, labelEnd);

 il.MarkLabel(labelIndex_2);
 il.EmitWriteLine("2.");
 il.Emit(OpCodes.Br_S, labelEnd);

 il.MarkLabel(labelEnd);
 il.Emit(OpCodes.Ret);     // 返回該值

 dynamicMethod.Invoke(null, new object[] { 1 });


 Console.Read();

運(yùn)行結(jié)果:

.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令

從上面的示例可以看出,使用 Switch?指令,其實是在 IL?中編寫類似于 Switch 語法的條件分支,而不是和C#?語法的 Switch 對應(yīng)。

總結(jié):

本篇介紹了在IL(Intermediate Language)代碼中常見的兩種指令類型:條件跳轉(zhuǎn)指令和Switch 分支跳轉(zhuǎn)指令。

條件跳轉(zhuǎn)指令則用于執(zhí)行數(shù)值比較操作,根據(jù)比較結(jié)果執(zhí)行相應(yīng)的跳轉(zhuǎn)操作或?qū)⒈容^結(jié)果壓入棧中。

由于其使用方式是一致,因此示例僅展示bool條件指令的使用,沒有對其它指令展開示例,但其它條件指令的含義,也是需要仔細(xì)了解一下的。

Switch 分支跳轉(zhuǎn)指令用于根據(jù)一個整數(shù)值選擇不同的目標(biāo)標(biāo)簽進(jìn)行跳轉(zhuǎn),類似于高級編程語言中的 switch 或者 case 語句。

通過 Switch 指令,可以使代碼更加簡潔、高效,并提高可讀性和可維護(hù)性。在處理具有多個選擇的情況下特別有用,例如枚舉類型或者狀態(tài)機(jī)的處理。

它們在條件分支指令和循環(huán)控制中起著關(guān)鍵作用,通過靈活運(yùn)用比較指令,可以實現(xiàn)各種復(fù)雜的算法和邏輯。

綜上所述,Switch 分支跳轉(zhuǎn)指令和條件跳轉(zhuǎn)指令是IL代碼中常用的兩種控制流指令,它們在編寫和優(yōu)化IL代碼時起著重要作用,能夠使代碼更加簡潔、高效和易于理解。文章來源地址http://www.zghlxwxcb.cn/news/detail-848945.html

到了這里,關(guān)于.NET Emit 入門教程:第六部分:IL 指令:7:詳解 ILGenerator 指令方法:分支條件指令的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • .NET Emit 入門教程:第六部分:IL 指令:9:詳解 ILGenerator 指令方法:運(yùn)算操作指令(指令篇結(jié)束)

    .NET Emit 入門教程:第六部分:IL 指令:9:詳解 ILGenerator 指令方法:運(yùn)算操作指令(指令篇結(jié)束)

    經(jīng)過前面幾篇的學(xué)習(xí),我們了解到指令的大概分類,如: 參數(shù)加載指令,該加載指令以?Ld 開頭,將參數(shù)加載到棧中,以便于后續(xù)執(zhí)行操作命令。 參數(shù)存儲指令,其指令以 St 開頭,將棧中的數(shù)據(jù),存儲到指定的變量中,以方便后續(xù)使用。 創(chuàng)建實例指令,其指令以 New 開頭,

    2024年04月22日
    瀏覽(23)
  • .NET Emit 入門教程:第三部分:構(gòu)建模塊(Module)

    .NET Emit 入門教程:第三部分:構(gòu)建模塊(Module)

    在這一部分中,我們將深入討論動態(tài)程序集中模塊的概念以及如何構(gòu)建和管理模塊。 模塊是動態(tài)程序集中的基本單位,它類似于一個獨(dú)立的代碼單元,可以包含類型、方法、字段等成員。 在動態(tài)程序集中,模塊扮演著組織代碼和實現(xiàn)代碼復(fù)用的關(guān)鍵角色。 它們允許開發(fā)人員

    2024年03月22日
    瀏覽(18)
  • .NET Emit 入門教程:第四部分:構(gòu)建類型(Type)

    .NET Emit 入門教程:第四部分:構(gòu)建類型(Type)

    在動態(tài)生成代碼的過程中,構(gòu)建類型(Type)是至關(guān)重要的一步。 通過使用 Emit 中的 TypeBuilder,我們可以定義和創(chuàng)建各種類型,包括類、結(jié)構(gòu)體和接口。 本節(jié)將深入探討如何使用 TypeBuilder 動態(tài)構(gòu)建類型,并介紹其在實際應(yīng)用中的重要性。 通過學(xué)習(xí)本系列之前的文章,我們可

    2024年03月25日
    瀏覽(27)
  • .NET Emit 入門教程:第二部分:構(gòu)建動態(tài)程序集(追加構(gòu)建靜態(tài)程序集教程)

    .NET Emit 入門教程:第二部分:構(gòu)建動態(tài)程序集(追加構(gòu)建靜態(tài)程序集教程)

    在本部分中,我們將深入探討如何使用C# Emit 來創(chuàng)建動態(tài)程序集。 動態(tài)程序集是在運(yùn)行時生成的,為我們提供了一種靈活、動態(tài)地構(gòu)建和加載程序集的能力。 程序集是.NET中的基本部署單位,它包含了可執(zhí)行代碼、資源、元數(shù)據(jù)等信息,是.NET應(yīng)用程序的基本組成單元之一。

    2024年03月21日
    瀏覽(32)
  • 【Git 入門教程】第六節(jié)、Git高級操作

    Git是一種非常強(qiáng)大的分布式版本控制系統(tǒng),可以幫助開發(fā)者輕松地管理和協(xié)調(diào)代碼庫。在本文中,我們將介紹一些Git高級操作,包括如何管理Git倉庫、標(biāo)簽、子模塊和忽略文件。 Git提供了許多命令來管理本地Git倉庫。以下是一些常用的管理命令: 初始化一個新的Git倉庫: 查

    2024年02月05日
    瀏覽(44)
  • Odoo17入門教程第六章 UI

    Odoo17入門教程第六章 UI

    現(xiàn)在我們已經(jīng)創(chuàng)建了新模型及其 相應(yīng)的,是時候了 與用戶界面交互。 在本章結(jié)束時,我們將創(chuàng)建幾個菜單以訪問默認(rèn)列表 和窗體視圖。 參考 :與此主題相關(guān)的文檔可以在數(shù)據(jù)文件中找到。 在第五章:安全性-簡介中,我們通過 CSV 文件添加了數(shù)據(jù)。CSV 當(dāng)要加載的數(shù)據(jù)具有

    2024年04月23日
    瀏覽(12)
  • 掌握Linux指令和權(quán)限:一個入門教程

    掌握Linux指令和權(quán)限:一個入門教程

    語法格式 :ls [選項][目錄或者文件] 功能 :對于目錄,該命令列出該目錄下的所有子目錄與文件。對于文件,將列出文件名以及其他信息。 a 列出目錄下的所有文件,包括以 . 開頭的隱含文件。 -d 將目錄象文件一樣顯示,而不是顯示其下的文件。 如:ls –d 指定目錄 -i 輸出文

    2023年04月23日
    瀏覽(26)
  • C語言快速入門教程1快速入門 2指令 3條件選擇

    C語言快速入門教程1快速入門 2指令 3條件選擇

    C是一種編程語言,1972年由Dennis Ritchie在美國AT T的貝爾實驗室開發(fā)。C語言變得很流行,因為它很簡單,很容易使用。今天經(jīng)常聽到的一個觀點(diǎn)是--\\\"C語言已經(jīng)被C++、Python和Java等語言所取代,所以今天何必再去學(xué)習(xí)C語言\\\"。我很不贊同這種觀點(diǎn)。這有幾個原因。這些原因如下:

    2024年02月03日
    瀏覽(35)
  • C語言入門教程,C語言學(xué)習(xí)教程(第三部分:C語言變量和數(shù)據(jù)類型)二

    C語言入門教程,C語言學(xué)習(xí)教程(第三部分:C語言變量和數(shù)據(jù)類型)二

    前面我們多次提到了字符串,字符串是多個字符的集合,它們由 \\\" \\\" 包圍,例如 \\\"http://c.biancheng.net\\\" 、 \\\"C語言中文網(wǎng)\\\" 。字符串中的字符在內(nèi)存中按照次序、緊挨著排列,整個字符串占用一塊連續(xù)的內(nèi)存。 當(dāng)然,字符串也可以只包含一個字符,例如 \\\"A\\\" 、 \\\"6\\\" ;不過為了操作方

    2024年01月17日
    瀏覽(21)
  • ESP8266-01s入門:上報和下發(fā)數(shù)據(jù)控制單片機(jī) AT指令講解和上云 燒錄AT固件與OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信單片機(jī)前置任務(wù))

    ESP8266-01s入門:上報和下發(fā)數(shù)據(jù)控制單片機(jī) AT指令講解和上云 燒錄AT固件與OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信單片機(jī)前置任務(wù))

    本項目教程總共分為四節(jié) 1.創(chuàng)建OneNET新版MQTT設(shè)備:為微信小程序與單片機(jī)通信打基礎(chǔ)(微信小程序通信單片機(jī)前置任務(wù)) 2.(當(dāng)前文章)ESP8266-01s入門:燒錄AT固件與OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信單片機(jī)前置任務(wù)) 3.物聯(lián)網(wǎng)實踐教程:微信小程序結(jié)合

    2024年02月04日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包