2024/5/23 學習雜記

目錄

位運算與邏輯運算讀程序練習

在switchcase 語句中能否使用continue關鍵字?為什么?

為什么盡量不使用goto語句?

void

i++與++i

i++和++i 哪個效率更高?

良好的條件比較語句風格

memcpy

memset


位運算與邏輯運算讀程序練習

int x = 3, y, z;

y = z = 2;

12  x = (y & z); printf("x = %d\n", x);

13  x = (y && z); printf("x = %d\n", x);

y = 4;

16  x = (y | z); printf("x = %d\n", x);

17  x = (y || z); printf("x = %d\n", x);

程序執行至第12 行時,y和z 的值都為2。此行把y和z 做按位與(&)運算的結果賦給變量x。y 和z 的二進制都是10,因此y & z 的結果為二進制10。因此x的值為2。

程序執行至第13 行時,y和z 的值都為2。此行把y和z 做邏輯與(&&)運算的結果賦給變量x。此時y和z 的值都不是0,因此y && z 的結果為1。因此x 的值為1。

程序執行至第16 行時,y的值為4,z 的值為2。此行把y和z 做按位或(|)運算的結果賦給變量x。此時y和z的二進制表示分別為100和010,因此y|z的結果為110。因此x的值為110,十進制表示為6。

程序執行至第17 行時,y 的值為4,z 的值為2。此行把y 和z 做邏輯或(||)運算的結果賦給變量x。此時y和z的值都不是0,因此y||z的結果為1。因此x的值為1。

在switchcase 語句中能否使用continue關鍵字?為什么?

switch-case語句中通常不能直接使用continue關鍵字。continue語句通常用于循環語句(如forwhile循環),用于跳過當前迭代并繼續下一次循環迭代。?

如果switch語句位于某個循環內部,那么continue將會作用于那個外層循環,跳過循環體的剩余部分并進入下一次迭代。如果switch不在循環內部,則continue關鍵字在技術上雖不產生語法錯誤,但也沒有實際用途,因為沒有迭代可跳過。

為什么盡量不使用goto語句?

1. 可讀性降低:goto語句使得程序的控制流變得難以追蹤,閱讀者需要跟隨goto跳轉來理解程序的執行順序,這增加了理解難度,尤其是當程序規模增大時。

2. 結構混亂:goto破壞了程序的結構化編程原則,如順序、分支(if-else、switch)、循環(for、while、do-while)等,這些結構提供了清晰的邏輯控制流控制方式。過度依賴goto可能導致“意大利面條代碼”,難以維護。

3. 維護困難:goto使得修改和維護代碼變得復雜,因為修改一處可能需要考慮對跳躍目標的影響,這可能導致連鎖反應式的修改,增加了出錯風險。

4. 調試挑戰:在調試時,goto使得堆棧跟蹤和理解程序的執行路徑復雜化,調試工具可能也難以準確展示程序流程。

5. 團隊協作:在團隊開發環境中,使用goto可能讓其他成員難以理解代碼意圖,增加協作難度,不利于代碼評審和交接。

6. 現代替代方案:現代編程語言和實踐提供了豐富的控制結構、函數、類、異常處理機制、迭代器等,能夠有效替代goto達到相同目的,同時保持代碼清晰和模塊化。

在某些特定場合(如低級別編程、操作系統內核、嵌入式系統或某些優化特定算法)goto可能有其正當使用場景,但總體上,遵循結構化編程原則,限制或避免goto使用是提升代碼質量和可維護性的共識。

void

如果指針p1和p2的類型相同,那么我們可以直接在p1和p2間互相賦值; 如果p1和p2指向不同的數據類型,則必須使用強制類型轉換運算符把賦值運算符右邊的 指針類型轉換為左邊指針的類型。

例如:

float *p1;

int *p2;

p1 = p2;

其中p1=p2語句會編譯出錯,提示“'=' :cannotconvertfrom'int*' to 'float*'”,必須改為: p1 = (float *)p2;

而void*則不同,任何類型的指針都可以直接賦值給它,無需進行強制類型轉換:

void *p1;

int *p2;

p1 = p2;

但如果

void *p1;

int *p2;

p2 = p1;

就會提示“'=' : cannotconvertfrom 'void *' to 'int *'”。

必須寫成? p2 = (int *)p1

i++與++i

#include <stdio.h>
int main(void){int i=8;printf("%d\n",++i);printf("%d\n",--i);printf("%d\n",i++);printf("%d\n",i--);printf("%d\n",-i++);printf("%d\n",-i--);printf("------\n");return 0;}

求輸出內容。

程序的說明如下:

程序第7 行,此時i 的值為8。這里先i 自增1,再打印i 的值。因此輸出9,并且i的值也變為9。

程序第8 行,此時i 的值為9。這里先i 自減1,再打印i 的值。因此輸出8,并且i的值也變為8。

程序第9 行,此時i 的值為8。這里先打印i 的值,再i 自增1。因此輸出8,并且i的值也變為9。

程序第10 行,此時i 的值為9。這里先打印i 的值,再i 自減1。因此輸出9,并且i的值也變為8。

程序第11 行,此時i 的值為8。這里的“-”表示負號運算符。因此先打印-i 的值,再i自增1。因此輸出-8,并且i的值也變為9。

程序第12 行,此時i 的值為9。這里的第一個“-”表示負號運算符,后面連在一起的兩個“-”表示自減運算符。因此先打印-i的值,再i自減1。因此輸出-9,并且i的值也變為8。

i++和++i 哪個效率更高?

內建數據類型的情況,效率沒有區別。

自定義數據類型的情況,++i效率較高。

i++(后置自增)和++i(前置自增)在大多數現代編譯譯器下對于基本數據類型(如int、float、double等)來說,性能上幾乎沒有區別。這兩種操作最終生成的匯編譯代碼很可能是相同的,尤其是在優化級別較高的編譯譯條件下。

在C++中:

?后置自增i++會先返回i的當前值,然后將i的值加1。

?前置自增++i會先將i的值加1,然后返回加1之后的值。理論上講,如果值不需要被保留,使用++i可能略微高效,因為它直接計算并返回新值,而i++可能涉及一個臨時變量來存儲舊值。但在實際應用中,這種差異微乎其微,幾乎不影響程序的整體性能,特別是在考慮現代處理器的速度和編譯器優化技術。

在具體應用時,選擇i++還是++i更多基于語境和語義的清晰性,而非性能考慮。

如果增量操作的結果是賦值操作的一部分,使用++i更自然;

如果需要先使用原值后遞增,則用i++。

良好的條件比較語句風格

假設浮點變量的名字為 x,它與 0.0的比較如下。

第一種:

1 if (x == 0.0)

2 if (x != 0.0)

第二種:

1 if ((x >= -EPSINON) && (X <= EPSINON))

2 if ((x < -EPSINON) || (X > EPSINON))

其中,EPSINON是允許的誤差(精度)。

第二種風格較良好。

注意:無論是float 還是double 類型的變量,都有精度限制。所以一定要避免將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。

假設布爾變量名字為flag,它與零值比較的標準if語句如下。

第一種:

1 if (flag == TRUE)

2 if (flag == FALSE)

第二種:

1 if (flag)

2 if (!flag)

第二種風格較良好。根據布爾類型的語義,零值為“假”(記為 FALSE),任何非零值都是“真”(記為TRUE)。TRUE的值究竟是什么并沒有統一的標準。例如Visual C++將TRUE定義為1,而Visual Basic 則將TRUE 定義為-1。因此不可將布爾變量直接與TRUE、FALSE進行比較。

假設整型變量的名字為value,它與零值比較的標準if語句如下。

第一種:

1 if (value == 0)

2 if (value != 0)

第二種:

1 if (value)

2 if (!value)

第一種風格較良好,第二種風格會讓人誤解value 是布爾變量,應該將整型變量用“==”或“!=”直接與0比較。

memcpy

void * memcpy(void *dest,constvoid *src,size_t len);

用于將一塊內存區域的數據從源地址復制到目的地址

每個參數的含義如下:

?void *dest:指向復制內容將要存放的目標數組的指針。目標區域必須有足夠的空間來容納復制的內容。

?const void *src:指向要復制內容的源數組的指針。

?size_t len:從源到目標復制的字節數。

#include <stdio.h>
#include <string.h>int main() {char src[50] = "Hello, World!";char dest[50]; // 目標量足夠大以容納src的內容// 使用memcpy函數復制src數組的內容到destmemcpy(dest, src, src, strlen(src) + 1); // 注意加1是因為要復制字符串末尾部的'\0''printf("Original String: %s\n", src);printf("Copied String: %s\n", dest);return 0;
}

在長度上加1是為了確保字符串的終止符也被復制,因為strlen不計算字符串的終止符'\0'字符

輸出結果

Original String: Hello, World!
Copied String: Hello, World!

memset

void *memset(void *buffer, int c, size_t num, size_t size);

memset函數會將從buffer指向的內存地址開始的連續size個字節(字節)全部設置為c指定的值。這個函數常用于清零內存塊(當c設為0時),或者快速填充固定值。

#include <stdio.h>
#include <string.h>int main() {int arr[10];memset(arr, 0, sizeof(arr)); // 將整個arr數組清零printf("Array after memset: %d\n", arr[0]); // 輸出應為0,因為所有元素都被清零了return 0;
}

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

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

相關文章

如何解決Redis緩存擊穿?

Redis緩存擊穿問題,也稱作熱點Key問題,通常發生在高并發場景下,當一個被高并發訪問且緩存重建業務較復雜的key突然失效時,大量請求會同時訪問數據庫,導致數據庫壓力瞬間增大。以下是解決Redis緩存擊穿問題的幾種方案: 使用鎖(互斥鎖): 原理:當緩存失效時,不是所有線…

CTF| 格式化字符串漏洞

格式化字符串漏洞是PWN題常見的考察點&#xff0c;僅次于棧溢出漏洞。漏洞原因&#xff1a;程序使用了格式化字符串作為參數&#xff0c;并且格式化字符串為用戶可控。其中觸發格式化字符串漏洞函數主要是printf、sprintf、fprintf、prin等C庫中print家族的函數 0x01 格式化字符…

雙非二本找工作前的準備day28

學習目標&#xff1a; 每天復習代碼隨想錄上的題目2-3道算法&#xff08;時間充足可以繼續&#xff09; 今日碎碎念&#xff1a; 1&#xff09;進入貪心與dp專題&#xff0c;過完準備二刷&#xff0c;以及刷劍指offer。 2&#xff09;這兩天沒更新是休息一下&#xff0c;然后…

如何深入理解、應用及擴展 Twemproxy?no.15

Twemproxy 架構及應用 Twemproxy 是 Twitter 的一個開源架構&#xff0c;它是一個分片資源訪問的代理組件。如下圖所示&#xff0c;它可以封裝資源池的分布及 hash 規則&#xff0c;解決后端部分節點異常后的探測和重連問題&#xff0c;讓 client 訪問盡可能簡單&#xff0c;同…

C語言之宏詳解(超級詳細!)

目錄 一、用宏前須知-#define相關知識 大致結構&#xff1a; 對預定義符號的補充&#xff1a; 二、用#define定義宏 什么是宏&#xff1f; #define的替換規則&#xff1a; 三、常用的宏定義 1、宏定義常量 2、定義一個宏語句 3、宏定義函數 宏與函數的對比&#xff1a; …

29【PS 作圖】宮燈 夜景轉換

夜景轉化 1 原圖 2 選中要變換的圖層,然后點擊“顏色查找” 再3DLUT文件中,選擇moonlight.3DL,可以快速把圖層變成偏夜景的顏色 結果如下: 3 選擇“曲線” 把曲線 右邊往上調【亮的更亮】,左邊往下調【暗的更暗】 4 添加燈光 新建一個圖層

前端面試題大合集8----性能優化篇

一、哪些方法可以提升網站前端性能 1、Http請求優化 主要分為減少Http請求次數&#xff0c;減小請求數據量和緩存三方面。 減少Http請求次數&#xff0c;可以通過以下方法實現&#xff1a; 合并js、css文件&#xff1b;使用css-spirites技術合并圖片&#xff1b;壓縮圖片大…

HTML+CSS+JS簡易計算器

HTMLCSSJS簡易計算器 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>簡易計算器</t…

AAA實驗配置

一、實驗目的 掌握AAA本地認證的配置方法 掌握AAA本地授權的配置方法 掌握AAA維護的方法 1.搭建實驗拓撲圖 2.完成基礎配置&#xff1a; 3.使用ping命令測試兩臺設備的連通性&#xff1a; 二、配置AAA 1.打開R1&#xff1a;配置AAA方案 這兩個方框內的可以改名&#xff0c…

百度頁面奔跑的白熊html、css

一、相關知識-動畫 1.基本使用&#xff1a;先定義再調用 2. 調用動畫 用keyframes定義動畫&#xff08;類似定義類選擇器&#xff09; keyframes動畫名稱{ 0%{ width:100px&#xff1b; } 100%{ width:200px; } } 使用動畫 div { width:200px; height:200px; background-…

前端面試題日常練-day28 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 1. 在Vue中&#xff0c;以下哪個選項用于監聽組件生命周期鉤子函數&#xff1f; a) watch b) computed c) lifecycle d) created 2. 在Vue中&#xff0c;以下哪個選項用于在列表渲染時為每個元素…

Pytorch線性模型(Linear Model)

基本步驟 ①首先準備好數據集&#xff08;DataSet&#xff09; ②模型的選擇或者設計&#xff08;Model&#xff09; ③進行訓練&#xff08;Train&#xff09;大部分模型都需要訓練&#xff0c;有些不需要。這一步后我們會確定不同特征的權重 ④推理&#xff08;inferring…

開封旅游三天兩夜旅游攻略

開封是一座歷史悠久的城市&#xff0c;有著豐富的文化遺產和美食。以下是一個三天兩夜的開封旅游攻略&#xff0c;供你參考&#xff1a; 一、行程安排 第一天&#xff1a; 上午&#xff1a;抵達開封&#xff0c;前往酒店辦理入住手續。隨后參觀開封博物館&#xff0c;了解開封…

【Python安全攻防】【網絡安全】一、常見被動信息搜集手段

一、IP查詢 原理&#xff1a;通過目標URL查詢目標的IP地址。 所需庫&#xff1a;socket Python代碼示例&#xff1a; import socketip socket.gethostbyname(www.163.com) print(ip)上述代碼中&#xff0c;使用gethostbyname函數。該函數位于Python內置的socket庫中&#xf…

廣場舞團|基于SprinBoot+vue的廣場舞團系統(源碼+數據庫+文檔)

廣場舞團系統 目錄 基于SprinBootvue的廣場舞團系統 一、前言 二、系統設計 三、系統功能設計 1 系統功能模塊 2 后臺登錄模塊 5.2.1管理員功能模塊 5.2.2社團功能模塊 5.2.3用戶功能模塊 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推…

Pytorch-06 使用GPU加速計算

要在PyTorch中使用GPU加速計算&#xff0c;需要將模型和數據移動到GPU上進行處理。以下是上一節演示修改后的示例代碼&#xff0c;展示了如何在訓練過程中利用GPU加速計算&#xff1a; import torch import torch.nn as nn import torch.optim as optim import time# 檢查GPU是…

2024-05-28 問AI: 在深度學習中,什么是反向隨機失活?

文心一言 在深度學習中&#xff0c;反向隨機失活&#xff08;Inverse Randomized Elimination&#xff0c;通常稱為Dropout&#xff09;是一種在訓練深度神經網絡時常用的正則化技術&#xff0c;用于防止過擬合。該技術通過隨機將神經網絡中的一部分神經元“失活”或“丟棄”來…

深度剖析:為什么 Spring 和 IDEA 都不推薦使用 @Autowired 注解

目錄 依賴注入簡介 Autowired 注解的優缺點 Spring 和 IDEA 不推薦使用 Autowired 的原因 構造器注入的優勢 Autowired 注解的局限性 可讀性和可測試性的問題 推薦的替代方案 構造器注入 Setter 注入 Java Config Bean 注解 項目示例&#xff1a;Autowired vs 構造器…

Android 項目Gradle文件講解(Groovy和Kotlin)

Android 項目Gradle文件講解&#xff08;Groovy和Kotlin&#xff09; 前言正文一、Gradle的作用二、Gradle的種類① 工程build.gradle② 項目build.gradle③ settings.gradle④ gradle.properties⑤ gradle-wrapper.properties⑥ local.properties 三、Groovy和Kotlin的語言對比…

裝飾模式:雞腿堡

文章目錄 UML類圖目錄結構Humburger.javaChickenBurger.javaCondiment.javaChuilli.javaLettuce.javaTest.java深度理解test怎么寫 UML類圖 目錄結構 我們從指向最多的開始寫 Humburger.java package zsms;public abstract class Humburger {protected String name;public S…