28 C 語言作用域詳解:作用域特性(全局、局部、塊級)、應用場景、注意事項

1 作用域簡介

????????作用域定義了代碼中標識符(如變量、常量、數組、函數等)的可見性與可訪問范圍,即標識符在程序的哪些位置能夠被引用或訪問。在 C 語言中,作用域主要分為三類:

  • 全局作用域
  • 局部作用域
  • 塊級作用域

????????需注意,同一作用域內不允許聲明同名的標識符


2 全局作用域

????????在函數和代碼塊(如分支語句、循環語句)之外定義的變量、常量、數組等具有全局作用域,可在程序的任何位置訪問,通常稱為全局變量、全局常量、全局數組

2.1 全局常量的特性

  1. 定義方式:
    1. 在函數體外用 const 修飾的變量為全局常量。
    2. 用 #define 定義的宏標識符通常被視為全局常量(但嚴格來說是預處理文本替換)。
  2. 作用域:
    • 默認全局可見,其他文件可通過 extern 聲明使用(后續章節講解)
    • 必須顯式初始化,未初始化的全局常量會導致編譯錯誤
  3. 不可修改性:全局常量在程序運行期間不可修改,試圖修改會導致編譯錯誤
#include <stdio.h>const double PI = 3.14; // 全局常量// 計算圓的面積
void printCircleArea(double radius)
{printf("半徑為%.2f的圓面積=%.2f\n", radius, PI * radius * radius);
}// 主函數
int main()
{printCircleArea(2.0); // 輸出: 半徑為2.00的圓面積=12.56return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.2 全局變量的特性

  1. 生命周期:程序運行期間始終存在
  2. 默認初始化:
    • 若未顯式初始化,全局變量會自動初始化為零值(如 int 為 0,double 為 0.0)
    • 字符類型默認初始化為空字符 \0
#include <stdio.h>// 全局變量未顯式初始化
int a;    // 自動初始化為 0
double b; // 自動初始化為 0.0
char c;   // 自動初始化為 '\0'int main()
{printf("a=%d\n", a); // 輸出: a=0printf("b=%f\n", b); // 輸出: b=0.000000printf("c=%c\n", c); // 輸出: c= (空字符)return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.3 全局數組的特性

  1. 默認初始化:未初始化的全局數組元素自動清零(數值類型為 0,字符類型為 \0)
  2. 訪問范圍:可在所有函數中直接使用
#include <stdio.h>int arr[5];  // 所有元素自動初始化為 0
char msg[6]; // 所有元素自動初始化為 '\0'int main()
{// 計算數組的長度int length = sizeof(arr) / sizeof(arr[0]);// 遍歷數組 arrfor (int i = 0; i < length; i++){printf("%d ", arr[i]); // 輸出: 0 0 0 0 0}printf("\n");printf("字符數組:%s\n", msg); // 輸出: 字符數組: (空字符串)return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.4 全局函數的特性

  1. ?定義方式:在函數體外定義的函數默認為全局函數。
  2. 作用域:
    1. 默認全局可見,其他文件可通過函數聲明調用
    2. 使用 static 修飾的函數僅在當前文件內可見(限制作用域,后續章節講解)
  3. 無嵌套定義:C 語言不支持函數嵌套定義,所有函數必須定義在全局作用域。
#include <stdio.h>// 全局函數
void greet()
{printf("Hello from global function!\n");
}int main()
{greet(); // 調用全局函數return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.5 全局作用域示例

#include <stdio.h>// 1. 全局常量(整個程序可見)
const double TAX_RATE = 0.1; // 稅率// 2. 全局變量(整個程序可見)
double totalIncome = 0.0; // 總收入
int callCount = 0;        // 函數調用計數器// 3. 全局函數(整個程序可見)
void calculateTax(double income)
{callCount++; // 修改全局變量,調用一次增加一次totalIncome += income;double tax = income * TAX_RATE;printf("收入=%.2f, 稅額=%.2f\n", income, tax);
}// 4. 靜態全局函數(僅當前文件可見)
static void printSummary()
{printf("總收入=%.2f\n", totalIncome);printf("函數調用次數=%d\n", callCount);
}// 5. 另一個全局函數
void resetSystem()
{totalIncome = 0.0; // 重置全局變量callCount = 0;     // 重置全局變量printf("系統已重置\n");
}int main()
{// 調用全局函數calculateTax(1000.0);calculateTax(2000.0);// 調用靜態全局函數(僅在當前文件可見)printSummary();// 調用另一個全局函數,重置數據resetSystem();// 再次調用全局函數calculateTax(500.0);// 再次打印摘要printSummary();return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.6 注意事項

  1. 避免濫用全局變量
    • 問題:全局變量易被意外修改,導致代碼耦合度高、難以維護
    • 建議:優先使用局部變量或函數參數傳遞數據,僅在必要時使用全局變量(如跨模塊共享狀態)
  2. 謹慎修改全局狀態
    • 問題:全局變量的修改可能影響多個函數,尤其在多線程環境中易引發競爭條件(Race Condition)
    • 建議:減少全局變量的可寫性(如用 const 修飾只讀數據),或通過封裝接口操作數據
  3. 限制全局函數的作用域
    • 問題默認全局函數可能與其他文件同名函數沖突(鏈接時重復定義)
    • 建議:若函數僅在當前文件使用,用 static 修飾限制其作用域,避免命名沖突
  4. 避免全局常量的硬編碼
    • 問題:全局常量直接嵌入代碼中,修改配置需重新編譯
    • 建議:將全局常量集中定義在頭文件中(如 #define 或 const),便于統一維護
  5. 注意全局成員的命名規范
    • 問題:全局變量/函數命名沖突可能導致難以調試的錯誤
    • 建議:為全局成員添加統一前綴(如 g_ 或 k_),例如 g_globalVar、k_MAX_USERS
  6. 警惕全局變量的生命周期
    • 問題:全局變量在程序啟動時初始化,退出時銷毀,可能占用資源過久
    • 建議:若變量僅在特定階段使用,考慮使用局部變量或動態分配內存(malloc/free)

3 局部作用域

3.1 局部作用域的定義

  • 定義:在函數內定義的變量、常量、數組等具有局部作用域,僅在定義它們的函數內部可見
  • 別名:局部變量、局部常量、局部數組等。
  • 形參的局部性:函數的形參也是局部變量,僅在函數內有效

3.2 局部作用域示例

#include <stdio.h>void add(int a)
{// 局部變量int b = 20;// 局部常量const double PI = 3.14;// 局部數組int nums[] = {10, 20, 30};printf("(a + b + nums[0]) * PI = %f\n", (a + b + nums[0]) * PI);
}int main()
{// 調用函數add(100); // 輸出:(a + b + nums[0]) * PI = 103 * 3.14 = 408.200000// 在 add 函數外使用局部變量、局部常量和局部數組是非法的// printf("%d\n", b);       // 錯誤:b 未定義// printf("%f\n", PI);      // 錯誤:PI 未定義// printf("%d\n", nums[0]); // 錯誤:nums 未定義return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

3.3 局部作用域的優先級

????????若局部作用域中定義了與全局作用域同名的標識符,優先使用局部定義(就近原則)

#include <stdio.h>// 全局變量
int a = 100;
int b = 200;void add()
{// 若局部作用域中定義了與全局作用域同名的標識符,優先使用局部定義int a = 300; // 局部變量,覆蓋全局變量 aa += 10;     // 修改局部變量 ab += 10;     // 修改全局變量 bprintf("函數 add 內部:a = %d, b = %d\n", a, b);
}int main()
{add();          // 輸出:函數 add 內部:a = 310, b = 210printf("函數 add 外部:a = %d, b = %d\n", a, b); // 輸出:a = 100, b = 210return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

3.4 局部變量和數組的初始化

  • 未初始化的風險:局部變量和數組若未顯式初始化,其值為未定義的垃圾值(系統之前分配的內存殘留值),可能導致程序行為異常

  • 強烈建議:始終顯式初始化局部變量和數組。

#include <stdio.h>int main()
{// 示例 1:未初始化的局部變量int uninitialized_var; // 未初始化,值為垃圾值printf("未初始化的變量 uninitialized_var: %d\n", uninitialized_var);// 示例 2:未初始化的局部數組int uninitialized_arr[5]; // 未初始化,數組元素值為垃圾值printf("未初始化的數組 uninitialized_arr: ");for (int i = 0; i < 5; i++){printf("%d ", uninitialized_arr[i]);}printf("\n");// 示例 3:顯式初始化的局部變量int initialized_var = 0; // 顯式初始化為 0printf("顯式初始化的變量 initialized_var: %d\n", initialized_var);// 示例 4:顯式初始化的局部數組int initialized_arr[5] = {0}; // 顯式初始化為全 0printf("顯式初始化的數組 initialized_arr: ");for (int i = 0; i < 5; i++){printf("%d ", initialized_arr[i]);}printf("\n");return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

3.5 注意事項

  1. 變量覆蓋問題
    1. 現象:在局部作用域中定義與全局變量或外部局部變量同名的變量時,會覆蓋同名變量(僅在當前作用域內生效),可能導致邏輯混淆或錯誤
    2. 建議:
      • 避免在局部作用域中定義與全局變量同名的變量
      • 若需區分,可為局部變量添加獨特命名前綴(如 local_)或后綴(如 _local)
  2. 生命周期限制

    1. 現象:局部變量在函數調用時創建,函數返回時銷毀。若在函數外訪問局部變量的地址或引用,會導致未定義行為(如內存錯誤或程序崩潰)

    2. 建議:不要返回局部變量的地址或引用
  3. 初始化依賴
    1. 現象:局部變量若未初始化,其值是未定義的(可能是隨機內存值),導致不可預測的行為
    2. 建議:始終初始化局部變量,對于指針,可初始化為 NULL

4 塊級作用域

4.1 塊級作用域的定義

  • 定義:塊級作用域是 C99 標準引入的特性,指在代碼塊(如 {} 包裹的分支語句、循環語句等)中定義的變量、常量、數組等,僅在該代碼塊內部可見
  • 別名:塊級變量、塊級常量、塊級數組等,也可統稱為局部變量、局部常量、局部數組。
  • 特性:與函數內的局部變量一致,塊級作用域的變量在代碼塊外不可訪問。

4.2 塊級作用域示例

#include <stdio.h>int main()
{// 示例 1:代碼塊中的塊級作用域{// 塊級變量int a = 20;// 塊級常量const double PI = 3.14;printf("a * PI = %f\n", a * PI); // 輸出:a * PI = 62.800000}// 示例 2:分支語句中的塊級作用域if (1){// 塊級數組int nums[] = {10, 20, 30};printf("%d %d %d\n", nums[0], nums[1], nums[2]); // 輸出:10 20 30}// 示例 3:循環語句中的塊級作用域for (int i = 0; i < 5; i++){printf("%d ", i); // 輸出:0 1 2 3 4}// 以下代碼會報錯,因為變量已超出塊級作用域// printf("%d\n", a);       // 報錯:'a' undeclared// printf("%f\n", PI);      // 報錯:'PI' undeclared// printf("%d\n", nums[0]); // 報錯:'nums' undeclared// printf("%d\n", i);       // 報錯:'i' undeclaredreturn 0;
}

????????程序在 VS Code 中的運行結果如下所示:

4.3?塊級作用域的優先級

????????塊級作用域的優先級遵循就近原則(也稱為詞法作用域或靜態作用域)。具體規則如下:

  1. 變量查找順序:
    • 當訪問一個變量時,編譯器會從當前代碼塊開始查找。
    • 如果當前代碼塊中未找到該變量,則逐層向外查找(父代碼塊、全局作用域等)
    • 若在所有作用域中均未找到變量,則編譯報錯(變量未定義)。
  2. 變量覆蓋:
    • 內層代碼塊的變量會覆蓋外層同名的變量(僅在當前代碼塊內生效)
    • 退出內層代碼塊后,外層變量的值會恢復。
#include <stdio.h>int globalVar = 100; // 全局變量int main()
{int outerVar = 10; // 外層局部變量if (1){int outerVar = 20;                         // 覆蓋外層 outerVar(僅在 if 塊內生效)printf("if 塊內 outerVar=%d\n", outerVar); // 輸出:20{int outerVar = 30;                            // 覆蓋 if 塊的 outerVar(僅在內部代碼塊生效)printf("內部代碼塊 outerVar=%d\n", outerVar); // 輸出:30}printf("if 塊恢復 outerVar=%d\n", outerVar); // 輸出:20}printf("外層 outerVar=%d\n", outerVar);   // 輸出:10printf("全局 globalVar=%d\n", globalVar); // 輸出:100return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

4.4 塊級作用域的優勢?

  1. 避免命名沖突:塊級變量僅在有限范圍內可見,減少全局命名沖突的風險
  2. 資源管理:塊級變量的生命周期與代碼塊綁定,便于管理內存和資源
  3. 代碼可讀性:明確變量的作用范圍,提高代碼可讀性和可維護性。

4.5 注意事項

  1. 變量生命周期限制
    1. 現象:塊級作用域中的變量在進入代碼塊時創建,退出代碼塊時銷毀。若在代碼塊外訪問,會導致未定義行為(如編譯錯誤或隨機值)
    2. 建議:
      • 不要在代碼塊外訪問塊級變量
      • 若需跨代碼塊共享數據,可在外部作用域定義變量
  2. 變量覆蓋問題
    1. 現象:塊級作用域中定義的變量會覆蓋同名的外部變量(僅在當前塊內生效),可能導致邏輯混淆
    2. 建議:
      • 避免在塊級作用域中定義與外部變量同名的變量
      • 若需區分,可為塊級變量添加獨特命名前綴(如 block_)
  3. ?C99 之前的限制
    1. 現象:在 C99 之前(如 C89),for 循環的變量必須聲明在循環外,導致變量作用域過大
    2. 建議:
      • 使用 C99 或更高版本,利用塊級作用域限制變量范圍
      • 若使用舊標準,手動限制變量作用域(如通過額外代碼塊)

5 作用域對比總結表

特性全局作用域局部作用域塊級作用域
定義位置函數或代碼塊外部函數或代碼塊內部任意代碼塊 {} 內部(如 if、for、while)
生命周期程序啟動時創建,退出時銷毀函數調用時創建,返回時銷毀進入代碼塊時創建,退出代碼塊時銷毀
可見性整個程序(所有文件)僅在定義它的函數或代碼塊內僅在定義它的代碼塊內
默認值默認初始化為 0 或 NULL無默認值(未初始化時為隨機值)無默認值(未初始化時為隨機值)
變量覆蓋風險高(易被意外修改,命名沖突)中(僅在函數內沖突)中(僅在代碼塊內沖突)
內存分配位置通常為數據段(靜態存儲區)棧內存棧內存
適用場景跨模塊共享狀態(如配置、常量)函數內部臨時數據限制變量作用域(如 for 循環、if 條件)
潛在問題耦合度高、難以維護、線程安全問題棧溢出(大數組)、變量逃逸(返回地址)嵌套過深、棧溢出(大數組)

6 作用域思考題

6.1 思考題 1

????????請仔細閱讀以下代碼,分析程序的運行結果。

#include <stdio.h>double price = 200.0;void test01()
{printf("test01: %.2f \n", price);
}void test02()
{price = 250.0;printf("test02: %.2f \n", price);
}int main()
{printf("main price=%.2f \n", price);test01();test02();test01();return 0;
}
  • 運行結果分析:
    • 初始時,全局變量 price = 200.0。
    • main 打印全局變量 price = 200.00。
    • test01() 打印全局變量 price = 200.00(未修改)。
    • test02() 修改全局變量 price = 250.0,并打印 price = 250.00。
    • test01() 再次打印全局變量 price = 250.00(因 test02 已修改)。

????????程序在 VS Code 中的運行結果如下所示:

6.2 思考題 2

????????請仔細閱讀以下代碼,分析程序的運行結果。

#include <stdio.h>int n = 10;void func1()
{int n = 20;printf("func1 n: %d\n", n);
}void func2(int n)
{printf("func2 n: %d\n", n);
}void func3()
{printf("func3 n: %d\n", n);
}int main()
{int n = 30;printf("main n:%d\n", n);func1();func2(n);func3();{int n = 40;printf("block n: %d\n", n);}return 0;
}
  • 運行結果分析:
    • 初始時,全局變量 n = 10,但被 main 的局部變量遮蔽,實際輸出 n = 30。
    • func1() 打印其局部變量 n = 20(遮蔽全局變量)。
    • func2(n) 打印 main 傳遞的實參 n = 30(形參作用域遮蔽全局變量)。
    • func3() 無局部變量 n,因此訪問全局變量 n = 10。
    • 代碼塊中的 n = 40 僅在塊內有效,退出后恢復為 main 的局部變量 n = 30(但此時已無后續操作)。

????????程序在 VS Code 中的運行結果如下所示:

6.3 思考題 3

????????請仔細閱讀以下代碼,分析程序的運行結果。

#include <stdio.h>int x = 5;void funcA()
{int x = 10;printf("funcA: %d\n", x);{int x = 15;printf("funcA block: %d\n", x);}printf("funcA end: %d\n", x);
}void funcB(int x)
{printf("funcB: %d\n", x);x += 5;printf("funcB modified: %d\n", x);
}void funcC()
{printf("funcC: %d\n", x);
}int main()
{int x = 20;printf("main: %d\n", x);funcA();funcB(x);funcC();{int x = 30;printf("main block: %d\n", x);}printf("main end: %d\n", x);return 0;
}
  • 運行結果分析:
    • ???????初始時,全局變量 x = 5,但被 main 的局部變量遮蔽。
    • main 打印局部變量 x = 20。
    • funcA() 定義局部變量 x = 10,打印 10;代碼塊內定義 x = 15,打印 15;退出代碼塊后恢復為 10,打印 10。
    • funcB(x) 接收 main 的局部變量 x = 20,打印 20;修改形參 x += 5 后打印 25(不影響全局或 main 的 x)。
    • funcC() 無局部變量 x,訪問全局變量 x = 5(未被修改)。
    • main 的代碼塊定義 x = 30,打印 30;退出后恢復為 main 的局部變量 x = 20,打印 20。

????????程序在 VS Code 中的運行結果如下所示:

提示:VS Code 變量作用域快速判斷技巧

????????在 VS Code 中調試或閱讀代碼時,若需快速判斷變量是全局還是局部變量,可按以下步驟操作:

  1. 定位變量定義
    • 將鼠標懸停在目標變量名上
    • 按住 Ctrl(Windows/Linux) 或 Cmd(Mac) 鍵,同時單擊鼠標左鍵
  2. 確認變量類型
    • 若跳轉至函數或代碼塊外部(如文件開頭),則為全局變量。
    • 若跳轉至函數內部或代碼塊內,則為局部變量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85413.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tomcat運行比較卡頓進行參數調優

在Tomcat conf/catalina.bat或catalina.sh中 的最上面增加參數 1. 初步調整參數&#xff08;緩解問題&#xff09; set JAVA_OPTS -Xms6g -Xmx6g -Xmn3g # 增大新生代&#xff0c;減少對象過早晉升到老年代 -XX:MetaspaceSize256m -XX:MaxMetaspaceS…

WSL2 安裝與Docker安裝

注意&#xff1a;如沒有科學上網請勿嘗試&#xff0c;無法判斷是否會因網絡錯誤導致的安裝失敗&#xff01;&#xff01;&#xff01; WSL2&#xff08;Windows Subsystem for Linux 2&#xff09; 功能簡介&#xff1a; WSL2 是微軟提供的在 Windows 上運行完整 Linux 內核的…

Redis的安裝與使用

網址&#xff1a;Spring Data Redis 安裝包&#xff1a;Releases tporadowski/redis GitHub 解壓后 在安裝目錄中打開cmd 打開服務&#xff08;注意&#xff1a;每次客戶端連接都有先打開服務&#xff01;&#xff01;&#xff01;&#xff09; 按ctrlC退出服務 客戶端連接…

springboot-響應接收與ioc容器控制反轉、Di依賴注入

1.想將服務器中的數據返回給客戶端&#xff0c;需要在controller類上加注解&#xff1a;ResponseBody; 這個注解其實在前面已經使用過&#xff0c;RestController其實就包含兩個注解&#xff1a; Controller ResponseBody 返回值如果是實體對象/集合&#xff0c;將會轉換為j…

將材質球中的紋理屬性對應的貼圖保存至本地

通過Texture2D的EncodeToPNG方法將紋理轉為圖片形式 material.GetTexture方法通過屬性名獲取紋理貼圖 material.SetTexture方法通過屬性名設置紋理貼圖 屬性名可在shader代碼中查看 using UnityEngine; using System.IO;public class TextureSaver : MonoBehaviour {public…

MySQL半同步復制配置和參數詳解

目錄 1 成功配置主從復制 2 加載插件 3 半同步復制監控 4 半同步復制參數 1 成功配置主從復制 操作步驟參考&#xff1a;https://blog.csdn.net/zyb378747350/article/details/148309545 2 加載插件 #主庫上 MySQL 8.0.26 之前版本: mysql>INSTALL PLUGIN rpl_semi_syn…

【筆記】Windows 成功部署 Suna 開源的通用人工智能代理項目部署日志

#工作記錄 本地部署運行截圖 kortix-ai/suna&#xff1a; Suna - 開源通用 AI 代理 項目概述 Suna 是一個完全開源的 AI 助手&#xff0c;通過自然對話幫助用戶輕松完成研究、數據分析等日常任務。它結合了強大的功能和直觀的界面&#xff0c;能夠理解用戶需求并提供結果。其強…

PCB制作入門

文章目錄 1 嘉立創使用旋轉 2元器件選擇MP2315SLM7815與LM7915 1 嘉立創使用 旋轉 空格旋轉 2元器件選擇 MP2315S MP2315S 是一款內置功率 MOSFET 的高效率同步整流降壓開關變換器。 其輸入電壓范圍為 4.5V 至 24V &#xff0c;能實現 3A 連續輸出電流&#xff0c;負載與…

2025——》NumPy中的np.logspace使用/在什么場景下適合使用np.logspace?NumPy中的np.logspace用法詳解

1.NumPy中的np.logspace使用: 在 NumPy 中,np.logspace函數用于生成對數尺度上等間距分布的數值序列,適用于科學計算、數據可視化等需要對數間隔數據的場景。以下是其核心用法和關鍵細節: 一、基礎語法與參數解析: numpy.logspace(start, stop, num=50, endpoint=True, ba…

Java實現中文姓名轉拼音生成用戶信息并寫入文件

中文姓名轉拼音 Java實現中文姓名轉拼音生成用戶信息并寫入文件&#xff08;shili域名版&#xff09;一、項目背景與功能簡介二、技術棧與核心組件2.1 主要技術2.2 功能模塊 三、核心代碼解析3.1 主函數邏輯&#xff08;流程控制&#xff09;3.2 拼音轉換模塊&#xff08;核心功…

Google car key:安全、便捷的汽車解鎖新選擇

有了兼容的汽車和 Android 手機&#xff0c;Google car key可讓您將Android 手機用作車鑰匙。您可以通過兼容的 Android 手機鎖定、解鎖、啟動汽車并執行更多功能。但是&#xff0c;Google car key安全嗎&#xff1f;它是如何工作的&#xff1f;如果我的手機電池沒電了怎么辦&a…

如何輕松將 iPhone 備份到外部硬盤

當您的iPhone和電腦上的存儲空間有限時&#xff0c;您可能希望將iPhone備份到外部硬盤上&#xff0c;這樣可以快速釋放iPhone上的存儲空間&#xff0c;而不占用電腦上的空間&#xff0c;并為您的數據提供額外的安全性。此外&#xff0c;我們還提供 4 種有效的解決方案&#xff…

AI煉丹日志-22 - MCP 自動操作 Figma+Cursor 自動設計原型

MCP 基本介紹 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一種開放協議&#xff0c;旨在標準化應用程序向大型語言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 提供了一種…

機器學習-線性回歸基礎

一、什么是回歸 依據輸入x寫出一個目標值y的計算方程&#xff0c;求回歸系數的過程就叫回歸。簡言之&#xff1a;根據題意列出方程&#xff0c;求出系數的過程就叫做回歸。 回歸的目的是預測數值型的目標值y&#xff0c;分類的目的預測標稱型的目標值y。 二、線性回歸 2.1線性…

解決RAGFlow(v0.19.0)有部分PDF無法解析成功的問題。

ragflow版本為&#xff1a;v0.19.0 1.解析的時候報錯&#xff1a;Internal server error while chunking: Coordinate lower is less than upper。 看報錯懷疑是分片的問題&#xff0c;于是把文檔的切片方法中的“建議文本塊大小”數值&#xff08;默認512&#xff09;調小&…

【前端】html2pdf實現用前端下載pdf

npm安裝完后&#xff0c;編寫代碼。 <template><div id"pdf-content">需要被捕獲為pdf的內容</div> </template><script> import html2pdf from html2pdf.js;export default {methods: {downloadPdf() {const element document.getE…

從零實現富文本編輯器#4-瀏覽器選區模型的核心交互策略

先前我們提到了&#xff0c;數據模型的設計是編輯器的基礎模塊&#xff0c;其直接影響了選區模塊的表示。選區模塊的設計同樣是編輯器的基礎部分&#xff0c;編輯器應用變更時操作范圍的表達&#xff0c;就需要基于選區模型來實現&#xff0c;也就是說選區代表的意義是編輯器需…

數論——質數和合數及求質數

質數、合數和質數篩 質數和合數及求質數試除法判斷質數Eratosthenes篩選法&#xff08;埃氏篩&#xff09;線性篩&#xff08;歐拉篩&#xff09; 質數有關OJ列舉P1835 素數密度 - 洛谷簡單的哥赫巴德猜想和cin優化 質數和合數及求質數 一個大于 1 的自然數&#xff0c;除了 1…

多商戶系統源碼性能調優實戰:從瓶頸定位到高并發架構設計!

在電商業務爆發式增長的今天&#xff0c;多商戶系統作為支撐平臺方、入駐商家和終端消費者的核心樞紐&#xff0c;其性能表現直接決定了商業變現效率。當你的商城在促銷期間崩潰&#xff0c;損失的不僅是訂單&#xff0c;更是用戶信任。 本文將深入剖析多商戶系統源碼性能優化的…

JDBC連不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.

最近為一個spring-boot項目下了mysql-9.3.0&#xff0c;結果因為mysql版本太新一直報錯連不上。 錯誤如下&#xff1a; 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…