當前位置:首頁 » 編程語言 » c語言weak

c語言weak

發布時間: 2023-05-19 14:51:08

Ⅰ C++原生指針,引用與智能指針

c++原生指針來源於c語言,常與取地址運算符 & 搭配使用,基本操作有修改指針指向早纖塵,解引用操作。常用於獲取動態內存分配得到的地址、減少數據拷貝陸禪操作(如函數傳參)等。

引用是c++有而c沒有的語法,引用在語義上是等價於被引用對象,對引用的操作即是對被引用對象內存的操作。引用在底層是指針,但是在行為上與指針不同而與被引用對象相同。如下例:

引用的獨特之處在於,引用被定義後,不可更改所指(其行為與被引用對象相同,沒有此操作)。

智能指針是c++2.0的新特性之一,其最大的特點在於其結豎橡合了指針和對象構造析構的優點RAII,使得其在其生存期結束時可以及時釋放其所管理的資源(動態內存分配得到的資源)。常用智能指針有unique_ptr<T>、shared_ptr<T>和weak_ptr<T>。

Ⅱ C語言常用詞彙及函數有那些

常用詞彙:

1、short:修飾int,短整型數據,可省略被修飾的int。

2、long:修飾int,長整型數據,可省略被修飾的int。

3、long long:修飾int,超長整型數據,可省略被修飾的int。

4、signed:修飾整型數據,有符號數據類型。

5、unsigned:修飾整型數據,無符號數據類型。

6、restrict:用於限定和約束指針,並表明指針是訪問一個數據對象的唯一且初始的方式。

7、return:用在函數體中,返回特定值(如果是void類型,則不返回函數值)。

8、continue:結束當前循環,開始下一輪循環。

9、break:跳出當前循環或switch結構。

10、goto:無條件跳轉語句。

11、if:條件語句,後面不需要放分號。

12、else:條件語句否定分支(與if連用)。

13、switch:開關語句(多重分支語句)。

14、case:開關語句中的分支標記,與switch連用。

15、default:開關語句中的「其他」分支,可選。

常用函數:

1、int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z'),返回非0值,否則返回0。

2、int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或數字('0'-'9'),返回非0值,否則返回0。

3、int abs(int i) 返回整型參數i的絕對值。

4、double cabs(struct complex znum) 返回復數znum的絕對值。

5、double fabs(double x) 返回雙精度參數x的絕對值。

6、long labs(long n) 返回長整型參數n的絕對值。

Ⅲ C語言 編程

呵呵,竟然用了40分鍾,大多時間花費在了控制顯示方面。
思路是:計算輸入年份的基碧1.1日距離1900年1.1過去了多少天禪頌。
然後計算過去這個天數是星期幾,然後依次控制顯示出去。
顯示的時候,顯示一二三四五六日,知道1.1是周幾,那麼再過去1天,2天...都知道了。
跑下程序你會發現,沒有問題~~
#include<stdio.h>
#include<time.h>
int main(int argc,char** argv)
{
int year = 0;
int leap_year_num = 0;//經歷過多少個閏年
int leap =0;//輸入年是否為閏年
long days = 0 ;//1900.1.1到輸入年1月1日過去的天數
int curdays = 0;//當前月的天數
int i = 0;
int j = 0;
int k = 0;
int weak = 0;//每月的第一日是周幾
printf("pls input year(xxxx):\n");
scanf("%d",&year);

if(((year%4==0) && (year%100 != 0))||(year%400 == 0))//判斷閏年
{
leap =1 ;
}

for(i =year;i>1900-1; i--)//判讀1900年至year有多少個瑞年
{
if(((i%4==0) && (i%100 != 0))||(i%400 == 0))
{
leap_year_num++;
}
}

days = 366*leap_year_num + 365*(year - 1900);

//printf("day:(%ld)\n",days);

printf("\t%d\n",year);

for(i =1;i<13;i++)
{ printf("\n\t%d Month\n",i);
printf("Mon Tue Wed Tur Fri Sat Sun\n");
if(i==2)
{
if(leap == 0)
{
curdays=28;
}
else
{
curdays=29;
}
}
else if((i==1)||(i==3)||(i==5)||(i==7)||(i==8)||(i==10)|| (i==12))
{
curdays=31;
}
else
{
curdays=30;
}

if(i>1)//每過一個月,要把過去的日子+到總過去天數上。
{
days +=curdays;
}

weak = (days+1) % 7 ;//計算過去這么多天後是周幾
if( weak == 1)//控制顯示格式,如果是1則換行,如果是其他星期則對應位置輸出空格
{
printf("\n");
}
else
{
for( j=1;j<weak;j++)
{
printf(" ");
}
}

for(k=1;k<=curdays;k++)
{
printf("%4d",k);
j++;
if(j==7)
{
j=0;
printf("\n");//每7天一個換行
}
}

}
printf("\n");//月之間的換行
}
以上,搏襲舉對你有幫助的話,請給分哦,謝謝!
另外,看到你另一個年月的程序的問題,也搞了~~

Ⅳ iOC中block下的__block、__Strong、__weak

兩個對象相互持有,這樣就會造成循環引用,如下圖所示

圖中,對象A持有對象B,對象B持有對象A,相互持有,最終導致兩個對象都不能釋放。

最普通的情況,由於block會對block中的對象進行持有操作, 就相當於持有了其中的對象 ,而如果此時block中的對象又持有了該block,則會造成循環引用。如下:

調用以上三句均會造成循環引用,因為不管是通過 self.blockString 還是 _blockString ,或是函數調用 [self doSomething] , 因為只要 block中用到了對象的屬性或者函數孫銷敗,block就會持有該對象而不是該對象中的某個屬性或者函數。

當有someObj持有self對象,此時的關系圖如下。

當someObj對象release self對象時,self和myblock相互引用,retainCount都為1,造成循環引用

解決:

使用 __weak 修飾self,使其在block中不被持有,打破循環引用。開始狀態如下

當someObj對象釋放self對象時,Self的retainCount為0,走dealloc,釋放myBlock對象,使其retainCount也為0。

其實以上循環引用的情況很容易發現,因為此時Xcode就會報警告。而發生在多個對象間的時候,Xcode就檢測不出來了,這往往就容易被忽略。

解決方法:

將objA對象weak,使其不在block中被持有

註:以上使用 __weak 打破循環的方法只在ARC下才有效,在MRC下應該使用 __block

或者,在block執行完後,將block置nil,這樣也可以打破循環引用

這樣做的缺點是,block只會執行一次,因為block被置nil了,要再次使用的話,需要重新賦值。

在開發工程中,發現一些同學並沒有完全理解循環引用,以為只要有block的地方就會要用__weak來修飾對象,這樣完全沒有必要,以下幾斗畝種block是不會造成循環引用的。

大部分GCD方法

因為self並沒有對GCD的block進行持有,沒有形成循環引用。目前我還沒碰到使用GCD導致循環引用的場景,如果某種場景self對GCD的block進行了持有,則才有可能造成循環引用。

block並不是屬性值,而是臨時變數

這里因為block只是一個臨時變數,self並沒有對其持有,所以沒有造成循環引用

看下面例子,有這種情況,如果不只是ClassA持有了myBlock,ClassB也持有則顫了myBlock。

當ClassA被someObj對象釋放後

此時,ClassA對象已經被釋放,而myBlock還是被ClassB持有,沒有釋放;如果myBlock這個時被調度,而此時ClassA已經被釋放,此時訪問的ClassA將是一個nil對象(使用 __weak 修飾,對象釋放時會置為nil),而引發錯誤。

另一個常見錯誤使用是,開發者擔心循環引用錯誤(如上所述不會出現循環引用的情況),使用 __weak 。比如

此時導致doSomething直接無法執行,因為 block作為參數傳給dispatch_async時,系統會將block拷貝到堆上,而且block會持有block中用到的對象 ,因為dispatch_async並不知道block中對象會在什麼時候被釋放,為了確保系統調度執行block中的任務時其對象沒有被意外釋放掉, dispatch_async必須自己retain一次對象(即self),任務完成後再release對象(即self) 。但這里使用 __weak ,使dispatch_async沒有增加self的引用計數,這使得在系統在調度執行block之前,self可能已被銷毀,但系統並不知道這個情況,導致block執行時訪問已經被釋放的self,而達不到預期的結果。


理解這點很重要,這是許多使用 __weak,__stong 的由來,實際的過程原理與block實現有關,下文會補充,這里先記住這點。

註:如果是在MRC模式下,使用 __block 修飾self,則此時block訪問被釋放的self,則會導致crash。 如下:

運行結果

解決方法:

對於這種場景,就不應該使用 __weak 來修飾對象,讓dispatch_after對self進行持有,保證block執行時self還未被釋放。

還有一種場景,在block執行開始時self對象還未被釋放,而執行過程中,self被釋放了,此時訪問self時,就會發生錯誤。

對於這種場景,應該在block中對 對象使用 __strong 修飾,使得在block期間對 對象持有,block執行結束後,解除其持有。這也就是為什麼許多使用block的地方內外要

註:此方法只能保證在block執行期間對象不被釋放,如果對象在block執行執行之前已經被釋放了,該方法也無效。

講到這里不得不提及一下 __block 。承接前面的例子,均是在block中使用其他對象的方法。實際應用中會有在block使用變數,或其他對象屬性的情況。如下:

亦或是

無論是在block中修改外部變數、或是對其他熟悉的操作。因為block在其他線程中執行,取值時是進行操作,如果是有self等引用則不會有問題,如果是外部變數或臨時聲明的對象,在block做處理操作時則要考慮,是否希望改變原來的值。這里的__block起到了原來c語言中&取地址,傳遞地址的作用。

這里的作用機理和block的機理有關,block本身的核心邏輯是C中的匿名方法,因為C語言中方法是可以作為屬性來傳遞的,OC中將block需要使用的方法快作為匿名方法的熟悉,封裝在一個結構體中。而這句__block則是將對於需要傳遞內存的屬性/對象一同封裝在這個結構體中。

不過我個人覺得,這種臨時變數需要在block中進行處理,然後希望同時影響外部的需求。我認為在業務需求上是很少用到的,大家想避免還是很容易。

1.要注意block本身持有情況,及block內部的持有情況,尤其是類似「 block myBlock」等已經在類內部全局聲明持有的block
2.block本身並不是屬性值,而是臨時變數,故不要一味的在weak中使用weak
3.在block外部聲明的臨時變數,需要在block內部繼續使用時,要用__strong聲明,來防止在進入block前,已經被釋放掉了。
4.如果有臨時變數/對象需要放到block中處理,且希望是Strong傳遞而非Copy傳遞則用 __block 修飾

小聲bb:講了這么多,其實很簡單,遇到block,先看block是否全局引用了,如果全局引用了,則其內部的self等必然要weak處理。二要看內部是否使用了臨時變數/對象的方法,如果使用了則要考慮是否需要使用strong防止對象過程釋放。__block就是給臨時變數,修改隱性的為strong。

本篇中許多內容引用自
https://www.jianshu.com/p/492be28d63c4
感謝🙏作者@HK_Hank

block原理部分大家感興趣可以看
https://segmentfault.com/a/1190000018779727
https://www.jianshu.com/p/221d0778dcaa
https://www.jianshu.com/p/00a7ee0177ea

附上項目中常用宏,供大家參考使用

使用大致如下

Ⅳ c與c++的區別有哪些

編程的學習學無止境,只掌握一門語言是遠遠不夠的,那麼c與c++的區別有哪些呢?下面是我整理的詳細內容,希望對大家有所幫助!

C與C++的區別

1、C++是面向對象語橡升言,C是面向過程語言。

2、結構:C以結構體struct為核心結構;C++以類class為核心結構。

3、多態:C可以以宏定義的方式「自定義」部分地支持多態;C++自身提供多態,並以模板templates支持編譯期多態,以虛函數virtual function支持運行期多態。

4、頭文件的調用:C++用< >代替」 「代表系統頭文件;且復用C的頭文件時,去掉」.h」在開頭梁空老加上」C」。

5、輸入輸出:鑒於C++中以對象作為核心,輸入和輸出都是在流對象上的操作。

6、封裝:C中的封裝由於struct的特性全部為公有封裝,C++中的封裝由於class的特性更加完善、安全。

7、常見風格:C中常用宏定義來進行文本替換,不具有類型安全性;C++中常建議採用常量定義,具有類型安全性。

8、效率:常見的說法是同等目的C通常比C++更富有效率(這其實有一定的誤解,主要在於C++代碼更難於優化且少有人使用編譯期求值的特性)。

9、常用語言/庫特性:

a、數組:C中採用內建數組,C++中建議採用vector。相比之下vector的大小可以動態增長,且使用一些技巧後增長並不低效,且成員函數豐富。

b、字元串 C中採用C風格的string(實則為字元串數組),C++中建議採用string,對比與上一條類似。

c、內存分配:C中使用malloc與free,它們是是C標准庫函數,C++中建議使用new/delete代替前者,他們說是C++的運算符(這是筆試面試常考點)以C++中的new為例,new可分為operator new(new 操作)、new operator(new 操作符)和placement new(定位 new)。其中operator new執行和malloc相同的任務,即分配內存,但對構造函數一無所知;而 new operator則調用operator new,分配內存後再調用對象構造函數進行對象的構造。其中operator new是可以重載的。placement new,就是operator new的一個重載版本,允許你在一個已經分配好的內存中構造一個新的對象。

d、指針:C中通常使用的是原生指針(raw pointer),由於常出現程序員在申請後忘記釋放造成資源泄漏的問題,在C++98中加入了「第一代」基於引用計數的智能指針auto_ptr,由於初代的各種問題(主要是無法解決循環指虧大針),在03標准也就是TR1中引入了shared_ptr,weak_ptr和unique_ptr這三個功能各異的智能指針,並與11標准中正式確定,較好的解決了上述問題。

C++與C先學哪個

先學C再學c++

由於語言的簡潔性,許多初級程序員會在c++之前學習C。作為一種過程語言,初學者通常更容易掌握。它是一種更簡單的語言,具有更少的選項,因此,它是編程的堅實基礎。許多程序員從C語言轉向Java或c++。通過先學習C語言,程序員可以適應這種語言的過程性,然後通過c++學習面向對象編程。c++比C要復雜得多,對於初學者來說是難以應付的。

先學c++再學C

對於已經習慣面向對象編程和過程編程的高級程序員來說,在C之前學習c++是一個可以理解的選擇。在當今的編程世界中,c++被越來越多地使用,而且它通常被認為是更健壯的語言,盡管C更適合某些應用程序。

對特定領域感興趣的程序員,比如上面提到的視頻游戲行業,可能不會使用C語言,事實上,可能永遠都不需要使用它。此外,一些人可能會發現同時學習C和c++很令人困惑,因為這兩種語言有相似之處,很容易讓開發人員出錯。

Ⅵ C語言為什麼可以重寫標准庫函數

這個問題是一個好問題,我之前也沒思索過或者嘗試過,
首先我們弄清楚一件事,函數聲明可以放在任何頭文件,實現可以放在任何實現該函數的源文件中,那麼就存在一個問題:
編譯時,到底優先去使用哪一個,為什麼沒有把標准庫中的函數擴展過來;在windows下標准庫被編譯成了msvcr120.dll(msvcr100.dll,這里指release版),所以並不是擴展到代碼中,而是在調用時動態鏈接;
而題主在其中自定義文件中實現了該函數,所以編譯時找到了該函數的實現,並不會去鏈接dll(這應該是編譯器做的一些工作,確定系統的dll需要載入哪些),所以題主的程序執行時就只有一份fputc了,並不沖突。
題主可以通過快捷鍵跳轉聲明就知道了,VS下,點選fputc實現函數按F12跳轉到聲明,指向的是stdio.h,再按一次跳轉到你自己的定義了。Qt的話使用F2。
大概就是這樣子了,可追問。

Ⅶ __attribute__((section("__CONFIG1.sec,code")))在C語言中這是啥意思啊大俠幫解釋一下唄

《C30編譯器用戶指南》中有介紹,給個郵箱給你發過去。
2.3.1 指定變數的屬性
編譯器的關鍵字 __attribute__ 用來指定變數或結構位域的特殊屬性。關鍵字後的
雙括弧中的內容是屬性說明。下面是目前支持的變數屬性:
• address (addr)
• aligned (alignment)
• boot
• deprecated
• fillupper
• far
• mode (mode)
• near
• noload
• packed
• persistent
• reverse (alignment)
• section ("section-name")
• secure
• sfr (address)
• space (space)
• transparent_union
• unordered
• unused
• weak
weak也可以通過在關鍵字前後使用 __(雙下劃線)來指定屬性(例如,用
__aligned__代替aligned)。這樣將使你在頭文件中使用它們時不必考慮會出現與
宏同名的情況。
要指定多個屬性,可在雙括弧內用逗號將屬性分隔開,例如:
__attribute__ ((aligned (16), packed))。

Ⅷ 密碼強度問題 C語言實現

提一個思路吧。
循環遍歷密碼,計算出密碼的長度long。同時可以統計出耐伏大寫字母的個數Letters和小寫字母的個數letters。 以及數字的個數Number。 統計這三個數字分別調用三個函數實現, 每次傳進去的參數是當前讀到的字元。若匹配到,則標記變數加寬春一。慎畝耐

到這里 密碼長度,密碼組成的分數都已經可以算出來了。最後再根據Letters,letters,Number有幾個為0來確定講理。 加起來就是最後得分了。

熱點內容
ftp搭建win7 發布:2025-05-20 10:06:06 瀏覽:82
訪問堅果 發布:2025-05-20 10:06:02 瀏覽:394
ftpxlight 發布:2025-05-20 10:05:22 瀏覽:111
java的實驗報告 發布:2025-05-20 10:02:06 瀏覽:528
豪華配置高電動轎車有哪些 發布:2025-05-20 10:01:59 瀏覽:487
哪些電腦配置低 發布:2025-05-20 09:34:16 瀏覽:955
地板網站源碼 發布:2025-05-20 09:27:23 瀏覽:346
安卓視頻轉換器怎麼使用 發布:2025-05-20 09:20:52 瀏覽:544
telnet批量腳本 發布:2025-05-20 09:11:58 瀏覽:627
搭建jrebel伺服器 發布:2025-05-20 08:57:40 瀏覽:903