斷言:assert()的實用指南

目錄

一、斷言概述

二、基本用法

三、工作原理

四、斷言的優點

五、啟用和禁用斷言

六、性能考慮

七、最佳實踐

八、示例代碼


一、斷言概述

? ? assert.h?頭文件定義了宏?assert(),用于在運行時驗證程序是否符合指定條件。如果條件不滿足,程序會報錯并終止運行。這種機制被稱為"斷言"(assertion),是程序開發中常用的調試工具。


二、基本用法

assert(p != NULL);

????????上述代碼會在程序執行到該行時,驗證變量?p?是否不等于?NULL。如果條件為真,程序繼續執行;如果為假,程序會終止并輸出錯誤信息。


三、工作原理

assert()?宏接受一個表達式作為參數:

  • 當表達式為真(返回值非零)時,assert()?不產生任何作用

  • 當表達式為假(返回值為零)時,assert()?會:

    • 向標準錯誤流?stderr?寫入錯誤信息

    • 顯示未通過的表達式

    • 顯示包含該表達式的文件名和行號

    • 調用?abort()?終止程序執行


四、斷言的優點

  1. 自動診斷:自動標識問題所在的文件和行號,便于快速定位錯誤

  2. 靈活啟用/禁用:通過定義?NDEBUG?宏可以全局啟用或禁用斷言

  3. 文檔作用:斷言可以充當代碼注釋,明確表達程序員的預期

  4. 防御性編程:幫助在開發階段捕獲非法條件和邏輯錯誤


五、啟用和禁用斷言

在?#include <assert.h>?之前定義?NDEBUG?宏可以禁用所有斷言:

#define NDEBUG
#include <assert.h>

????????這樣編譯器會忽略文件中的所有?assert()?語句。如需重新啟用斷言,只需移除或注釋掉?NDEBUG?的定義。


六、性能考慮

斷言的缺點是會引入額外的運行時檢查,可能影響程序性能。因此:

  • Debug 版本:建議啟用斷言,幫助開發者發現問題

  • Release 版本:通常禁用斷言以提高性能

在 Visual Studio 等集成開發環境中,Release 版本會自動優化掉斷言代碼。


七、最佳實踐

  1. 使用斷言檢查不應發生的條件,而不是預期的錯誤情況

  2. 不要用斷言替代正常的錯誤處理

  3. 斷言表達式不應有副作用(如修改變量值)

  4. 在關鍵算法和復雜邏輯處添加斷言

  5. 為函數的前置條件和后置條件添加斷言


八、示例代碼

#include <stdio.h>
#include <assert.h>int divide(int a, int b) {assert(b != 0 && "Divide by zero");  // 檢查除數不為零return a / b;
}int main() {printf("10/2 = %d\n", divide(10, 2));printf("10/0 = %d\n", divide(10, 0));  // 會觸發斷言失敗return 0;
}

當斷言失敗時,程序會輸出類似以下信息:

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

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

相關文章

開發避坑指南(27):Vue3中高效安全修改列表元素屬性的方法

需求 Vue3 中如何遍歷list并修改list元素的屬性的值&#xff1f; 解決辦法 1、?使用 map 方法? const newList list.value.map(item > {return {...item,modifiedProperty: newValue // 修改的屬性名稱和屬性值} })Vue 中的 map() 函數是 JavaScript 數組的高階函數&…

L4 級別自動駕駛 硬件架構設計

L4 級自動駕駛&#xff08;根據 SAE 標準&#xff0c;屬于 “高度自動化”&#xff09;的核心是系統在特定場景下&#xff08;如城市道路、高速路&#xff09;可完全自主完成駕駛任務&#xff0c;無需駕駛員干預&#xff0c;且在系統失效時能自動實現安全降級。其硬件架構需滿足…

【網絡安全測試】手機APP安全測試工具NowSecure 使用指導手冊(有關必回)

以下是 NowSecure安全測試工具 的詳細使用指導&#xff0c;涵蓋從環境準備、測試配置到報告分析的完整流程&#xff0c;適合團隊協作或合規性審計場景&#xff1a; NowSecure 使用指導手冊 1. 工具簡介 定位&#xff1a;自動化移動應用&#xff08;Android/iOS&#xff09;安全…

Matlab(5)進階繪圖

一、Advanced 2D plots1. Logarithm Plotsx logspace(-1,1,1000); % 從-1到1生成等間隔的1000個點 y x .^ 2; subplot(2,2,1); plot(x,y); title(Plot); subplot(2,2,2); semilogx(x,y); title(Semilogx); subplot(2,2,3); semilogy(x,y); title(Semilogy); subplot(2,2,4);…

運維學習Day22——Anisible自動化與基本使用

文章目錄01-Ansible 自動化介紹Ansible 自動化介紹手動執行任務和自動化執行任務基礎架構即代碼Ansible 與 DevOps什么是 ANSIBLE&#xff1f;Ansible 特點Ansible 概念和架構Ansible WayAnsible 用例Ansible 部署準備實驗環境控制節點受管節點LinuxWindows網絡設備02-Ansible …

Codeforces Deque工藝

題目來源&#xff1a; 問題 - 2128B - Codeforces 這道題有些地方表達的并不是特別準確&#xff0c;首先就是從最左端與最右端移除一個元素&#xff0c;實際含義是從原數組的最左端或者最右段依次取出一個元素構成一個新的數組&#xff0c;使得這個新數組的數組符合題目的“好…

談談《More Effective C++》的條款30:代理類

在《More Effective C》的條款30中&#xff0c;Scott Meyers深入探討了**代理類&#xff08;Proxy Classes&#xff09;**的設計與應用。代理類是一種通過重載運算符模擬原始對象行為的設計模式&#xff0c;其核心目標是在不直接暴露原始對象的情況下&#xff0c;提供額外功能、…

實用AI在線開發工具網址匯總(含免費限額,國內可訪)

AI在線開發工具 標題分類屬性在線開發工具1https://www.builder.io/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具2https://replit.com/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具3https…

react+vite來優化下每次使用hook函數都要引入的情況

前言&#xff1a;react項目中&#xff0c;每個頁面都得引入react/react-dom等元素&#xff0c;就像uniapp的項目中得onload,onshow等生命周期一樣&#xff0c;這里也可以用vite的插件&#xff1a;unplugin-auto-import 來解決我們每次都需要調用才能使用hook方法的問題。安裝&a…

【排序算法】⑤冒泡排序

系列文章目錄 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希爾排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接選擇排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

如何使用gpt進行模式微調(2)?

對 GPT&#xff08;Generative Pre-trained Transformer&#xff09;類大模型進行微調&#xff08;Fine-tuning&#xff09;&#xff0c;是將其適配到特定任務或領域的關鍵步驟。以下是 ??全流程指南??&#xff0c;涵蓋方法選擇、數據準備、訓練配置、評估部署等核心環節&a…

基于飛算JavaAI實現圖書管理系統框架部署

摘要 本文詳細介紹了如何利用飛算JavaAI技術實現圖書管理系統的框架部署。首先闡述了飛算JavaAI的基本概念、特點和優勢&#xff0c;接著對圖書管理系統的需求進行分析&#xff0c;然后按照軟件開發流程&#xff0c;從系統設計、代碼生成、框架搭建到部署測試&#xff0c;逐步展…

ODE-by-Matlab-01-人口增長模型

博客地址&#xff1a;Matlab微分方程01-模型 馬爾薩斯模型 馬爾薩斯模型是人口增長模型中最簡單的模型&#xff0c;它由英國牧師家馬爾薩斯在1798年提出。 他利用在教堂工作的機會&#xff0c;收集英國100多年的人口數據&#xff0c;發現人口的相對增長率是常數。 在這個基礎…

云原生環境 Prometheus 企業級監控實戰

目錄 一&#xff1a;基于 kubernetes 的 Prometheus 介紹 1&#xff1a;環境簡介 2&#xff1a;監控流程 3&#xff1a;Kubernetes 監控指標 二&#xff1a;Prometheus 的安裝 1&#xff1a;從 Github 克隆項目分支 2&#xff1a;安裝 Prometheus Operator --server-si…

Python爬蟲實戰:研究django-dynamic-scraper 框架,構建電商動態數據采集系統

1. 引言 1.1 研究背景 據 Statista 數據,2025 年全球互聯網數據總量將突破 175ZB,其中 80% 為非結構化數據(網頁、文本、圖像等)。高效提取這些數據對企業競爭情報、學術研究至關重要。網絡爬蟲作為數據獲取的核心工具,經歷了從靜態頁面抓取到動態內容解析的演進,但傳統…

掌握MATLAB三維可視化:從基礎到實戰技巧

目錄 1. 引言&#xff1a;三維可視化的重要性 2. 基礎三維圖形繪制 2.1 三維曲線圖&#xff08;plot3&#xff09; 2.2 三維散點圖&#xff08;scatter3&#xff09; 2.3 三維網格圖&#xff08;mesh&#xff09; 2.4 三維曲面圖&#xff08;surf&#xff09; 3. 參數曲面…

Linux 服務部署:自簽 CA 證書構建 HTTPS 及動態 Web 集成

Linux 服務部署&#xff1a;自簽 CA 證書構建 HTTPS 及動態 Web 集成 一、HTTPS基礎原理 HTTPS是HTTP協議基于SSL/TLS協議的加密版本&#xff0c;核心差異及握手過程如下&#xff1a;HTTP與HTTPS對比協議傳輸方式端口核心特點HTTP明文傳輸80無加密&#xff0c;安全性低HTTPS數據…

Python3.10 + Firecrawl 下載公眾號文章

獲取Firecrawl apikey 打開官網&#xff0c;使用github賬號登錄 https://www.firecrawl.dev/ 進入個人中心 https://www.firecrawl.dev/app/api-keys 使用PyCharm創建python項目 創建.env # API配置 FIRECRAWL_API_KEYfc-9*********0816d5ac6b20 # 輸出配置 OUTPUT_DIRout…

IoT/透過oc_lwm2m/boudica150 源碼中的AT指令序列,分析NB-IoT接入華為云物聯網平臺IoTDA的工作機制

文章目錄概述指令調用順序具體接入指令分析ATE0 關閉回顯ATQREGSWT 設置&#xff08;平臺&#xff09;注冊模式ATQLWSREGIND0 手動注冊平臺set_autoconnect / ATNCONFIGATNBANDx,xset_plmn / ATCOPS_set_apn / ATCGDCONT(安全)接入參數 CDPDTLSPSKATNNMI 設置新消息指示_check_…

Android UI(一)登錄注冊 - Compose

UI - 登錄注冊 - Compose一、聲明式UI1. **顛覆傳統開發模式**2. **技術優勢**3. **開發效率提升**4. **未來生態方向**5. **實際影響**二、創建項目1. Compose UI結構2. Scaffold3. 可組合函數三、創建組件頁面1. LoginPage2. RegisterPage3. MainPage四、導航1. 添加依賴2. 使…