
前言今天學的是 C 語言 Day05循環嵌套、goto 語句和數組入門。前面已經掌握了三種循環今天主要看循環怎么嵌套、跳轉語句怎么用以及數組這個“容器”怎么創建。本篇文章要解決三個問題循環嵌套的執行順序和次數怎么算goto 為什么能模擬循環但平時要少用數組的動態初始化和靜態初始化有什么區別學習思路為了把“循環”和“容器”串起來我先理解嵌套循環的外層/內層關系再用 goto 對比循環寫法最后學數組創建和內存地址。循環嵌套 - goto 跳轉 - 數組概述 - 創建數組 - 用截圖復盤前置知識需要會for、while、do-while以及printf、scanf。不需要會指針、結構體、復雜數據結構。建議先看Day04 的循環控制關鍵字。核心內容1. 循環嵌套循環嵌套是指循環的循環體語句中還有循環結構。外層循環每執行一次內層循環要完整執行一輪才能進入外層的下一次循環。重點規律內層循環體執行次數 外層循環次數 × 內層循環次數。外層循環體中的其他代碼每輪外層循環執行一次。平時如果遇到三層以上嵌套大概率是思路可以把問題拆簡單。1.1 我的代碼用三層循環模擬時鐘第一張代碼截圖是時、分、秒的嵌套循環外層表示小時中層表示分鐘內層表示秒鐘。每一小時都要把 60 分鐘跑完每一分鐘都要把 60 秒跑完。這里最容易理解錯的地方是不是小時走完再走分鐘而是小時每走 1 次分鐘要把一整輪走完。1.2 我的代碼9×9 乘法表第二張截圖是經典的 9×9 乘法表。外層循環控制行數內層循環控制列數所以內層的結束條件跟著外層當前行數變化。for (int j 1; j 9; j) // 外層行 { for (int i 1; i j; i) // 內層列 { printf(%d * %d %d\t, i, j, i * j); } printf(\n); }關鍵點第j行只打印1到j列所以乘法表是左下三角形狀。1.3 我的代碼空心三角形第三張截圖是鍵盤錄入行數后打印指定行數的空心三角形。這里不只使用了嵌套循環還在內層循環里加了條件判斷只有每行的第一列、最后一列或最后一行才打印*。實現思路外層循環控制行數。第一個內層循環打印空格。第二個內層循環打印星號或空格。滿足邊界條件時打印*否則打印空格。關鍵結論嵌套循環不是“越深越厲害”能用兩層解決的問題就不要寫成三層。2. goto 語句goto 通過“標簽 跳轉”實現流程控制。第四張截圖里我用它實現了一個類似循環的效果先給代碼塊起名start:滿足條件時打印并修改i最后跳回start繼續判斷。int i 1; start: if (i 5) { printf(Hello %d \n, i); i; goto start; }goto 可以模擬循環但跳轉位置不清晰時代碼會變得很難維護。平時開發中能用for、while、do-while解決的問題優先不用 goto。關鍵結論goto 不是不能用而是要明確知道自己在跳到哪里學習階段主要用于理解程序流程。3. 數組概述數組是一組同類型數據的集合可以理解成一個定長的同類型容器。數組一旦被定義長度和內存地址都不能發生改變。數組的重要特點一個數組中所有元素的數據類型必須一致。數組元素有索引索引從0開始最大索引是“數組長度 - 1”。數組中可以存儲重復元素。C 語言中的數組沒有length屬性。數組名保存的是數組在內存中的地址也就是第一個元素的地址。學習容器類型可以按三步來如何創建、增刪改查、如何遍歷。4. 如何創建數組創建數組有兩種方式初始化方式誰決定長度誰決定元素值格式動態初始化程序員計算機數據類型 數組名[長度];靜態初始化計算機自動計算程序員數據類型 數組名[] {值1, 值2, ...};第五張截圖是我寫的數組創建與地址輸出代碼。動態初始化數組里的元素值是內存中的未知值也就是“垃圾值”靜態初始化則直接把值寫進數組。// 動態初始化長度由我決定元素值未知 double arr1[5]; ? // 靜態初始化元素值由我決定長度自動計算 int arr2[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ? // 數組名就是數組首元素地址 printf(arr1 : %p \n, arr1); printf(arr1[0] : %p \n, arr1[0]);關鍵結論動態初始化先占空間值不確定靜態初始化直接給值長度自動算出來。動手實踐今天實際動手寫了五個練習三層循環模擬時鐘強化嵌套循環執行順序。9×9 乘法表練習外層行、內層列的結構。空心三角形練習循環加條件判斷的組合。goto 實現循環理解標簽跳轉。動態初始化和靜態初始化數組并輸出數組地址驗證“數組名 首元素地址”。這些代碼截圖已經分別插入到對應章節里發布前可以再對照一遍。踩坑記錄現象原因解決辦法內層循環執行次數算錯忘記用“外層次數 × 內層次數”寫代碼時用注釋標出外層、內層嵌套層數越寫越多想把所有邏輯塞進一個循環優先拆函數或簡化思路goto 跳來跳去看不懂標簽和跳轉位置不清晰能用循環就不用 goto動態初始化數組直接查元素元素值還沒有賦值先賦值再使用或直接靜態初始化C 數組沒有length屬性用 Java 的習慣寫 C 代碼用sizeof 數組名 / sizeof 數組名[0]總結我掌握了外層循環執行一次內層循環完整執行一輪。我掌握了嵌套循環的總執行次數 外層次數 × 內層次數。我掌握了goto 用標簽跳轉但正常流程優先用循環。我掌握了數組是定長的同類型容器索引從0開始。我掌握了動態初始化由程序員決定長度靜態初始化由程序員決定元素值。我還需要弄清楚數組創建好之后如何完成增刪改查和遍歷。下篇預告下一篇會解決數組的增刪改查、遍歷操作以及棧內存的基本特點把數組真正用起來。