91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

徐土豆
認證:優質創作者
所在專題目錄 查看專題
用“位操作”取代“取模操作”判斷奇數偶數
c語言運行時出現segment fault的原因
一文理解C語言中的volatile修飾符
C語言中的內存布局(memory layout)
do{}while(false)結構的妙用
const修飾符并不保證運行時的常數性質
作者動態 更多
給定計算預算下的最佳LLM模型尺寸與預訓練數據量分配
05-19 09:33
大模型推理時的尺度擴展定律
05-18 10:32
世界多胞體與世界模型
05-13 09:42
獎勵模型中的尺度擴展定律和獎勵劫持
05-12 08:41
MeCo——給預訓練數據增加源信息,就能減少33%的訓練量并且提升效果
05-08 09:13

do{}while(false)結構的妙用

本文轉自徐飛翔的“do{}while(false)結構的妙用

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

看源碼的時候,發現某個框架的源碼里面經常出現如下片段:

do{
	if (ASSERT(some_input_1) && ASSERT(some_input_2)) {
		...
	}
} while(false)

我對于do{} while(false)結構的使用,在此之前無非兩種,第一種是基本用法,也就是把它當成循環結構使用,和for(;;)while(){}沒太大區別;還有一種用法是用在宏定義中,如下所示:

#define LARGER(x,y) x > y? x:y

int a = 2 * LARGER(10,30);

此時我們本來期望a = 60,其實因為字符替代的原因,實際上是int a = 2 * x > y?x:y =30。這就是bug的源頭之一。通過do{macro_code} while(false)結構,能對macro_code進行很好的分割。

然而,這個結構還有一個好處,其本質是一個循環結構,意味著它可以提前break,在多條件判斷的環境下是一個作為對goto的很好的取代。如:

do {
	if (ASSERT(some_input_1) && ASSERT(some_input_2)) {
		ERR_LOG('log_info', pFile);
		break;
	}
	if (IS_EXIST(path)) {
		ERR_LOG('log_info', pFile);
		break;
	}
	// the residual code you need , the main stream
} while(false)

通過這種手段,基于作為入口條件判斷,如果一旦不符合條件,可以直接break,跳到循環之外,這相當于很好地應用了goto的功能,而沒有引入goto的負作用(全局跳轉,難以維護)。

Reference

[1]. https://stackoverflow.com/questions/2314066/do-whilefalse

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關注 52
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 溧阳市| 牟定县| 焦作市| 内江市| 壶关县| 富川| 永川市| 清流县| 大竹县| 武邑县| 海林市| 建平县| 高阳县| 瓦房店市| 厦门市| 湖北省| 冷水江市| 休宁县| 温泉县| 枝江市| 子长县| 宜良县| 湘乡市| 盐津县| 闻喜县| 汶上县| 昌图县| 广宗县| 资溪县| 江油市| 佛学| 闸北区| 乌兰县| 太仆寺旗| 宜城市| 剑河县| 松江区| 句容市| 兰州市| 夏邑县| 稻城县|