当前位置:首页 » 编程语言 » 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来确定讲理。 加起来就是最后得分了。

热点内容
压缩文件设置密码有什么意思 发布:2025-05-20 11:26:37 浏览:550
造梦西游qq登录如何修改密码 发布:2025-05-20 11:18:36 浏览:381
淘宝缓存清理后还是大 发布:2025-05-20 11:15:39 浏览:148
ios云存储自动订购 发布:2025-05-20 11:06:22 浏览:109
编程与数学 发布:2025-05-20 11:01:23 浏览:444
asp连接远程数据库 发布:2025-05-20 10:50:20 浏览:389
一般电脑配置哪个好 发布:2025-05-20 10:40:58 浏览:602
我的世界撸树服务器 发布:2025-05-20 10:33:37 浏览:741
ftp搭建win7 发布:2025-05-20 10:06:06 浏览:82
访问坚果 发布:2025-05-20 10:06:02 浏览:395