C语言主调函数与被调函数 奇怪 现象

此程序我在DEV-C++和Cfree5上运行,均无误,但是,若将test函数返回值改为void
则在DEV-C++上出现Warning,但是能运行出想要的结果,在Cfree5上会出现error
,但是之前学习的C的书中都说,被调函数置于主调函数之后,是违法的,但是为什么
test函数返回值为int可以无error呢?

 # include<stdio.h>
int main()
{
    test();
} 
int  test()
{
    printf("this is a test!\n");
    return 0;
}

5个回答

应该是编译器不标准造成的,一般严格来说无论有没有返回值,被调用的函数如果写到主函数后面后要加函数声明的~否则就会报错!

无非两个可能,要么studio.h里面正好也定义了test这个函数,或者有test这个函数指针变量,要么编译器不标准,在标准之外允许先使用后定义。

还是推荐使用VS系列。。。毕竟标准。。。函数至于main之后,相当于无定义函数。。。

一般情况,函数不显示指定返回值类型,系统会默认为int类型,这个也会跟编译器有关系(但是目前的都没问题),建议使用linux系统进行测试(毕竟标准)

你之所也改为void报错是因为你的最后一句返回的是一个整型,与你定义的不相符合

Hold_C
Hold_C 我把test定义为void时,最后的return 0我也是注释掉了的
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言中被调函数在主调函数的前面和后面有什么区别?
一: void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("x=%d,y=%d\n",x,y); } void main() { int a,b; //a,b是实参。 scanf("%d,%d",&a,&b); swap(a,b); printf("a=%d,b=%d\n",a,b); system("pause"); } 运行结果: 输入:2,5 输出:x=5,y=2 a=2,b=5 二: void main() { int a,b; //a,b是实参。 scanf("%d,%d",&a,&b); swap(a,b); printf("a=%d,b=%d\n",a,b); system("pause"); } void swap(int x,int y) { int temp; temp=x; x=y; y=temp; printf("x=%d,y=%d\n",x,y); } 运行结果: 输入:2,5 输出:a=5,b=2 上面的两个为什么运行结果完全不同?第二个中的a,b的值怎么互换了?不是形参不能传递给实参吗?为什么第二个传递了?
请问用什么方式叫做代理调用函数中主调函数的私有变量呢?
请问用什么方式叫做代理调用函数中主调函数的私有变量呢?callbyname的方式怎么传私有变量的变量名呢?
c语言中函数返回值类型的问题
看一道改错题: #include<stdio.h> #include<conio.h> #include<math.h> proc(int k)//很显然根据主调函数和返回值类型知道这里缺少类型 { int n;float s,w,p,q; n=1; s=1.0; while(n<=k){ w=2.0*n; p=w-1.0; q=w+1.0; s=s*w*w/p/q; n++; } return s; } void main(){ system("CLS"); printf("%f\n",proc(20)); } 我觉得既然变量s是float型,就应该改成float proc(int k)。可是本题的答案确实这样子改的 double proc(int k)我想问答案这样改对吗?如果对道理是什么?
更改主调函数中的变量,使用scanf给变量赋值怎么正确使用?
如下代码,请帮忙解答,谢谢。 在main()函数中调用时 为什么用scanf的时候,输入double类型的值时得出的值是: 1,2 x is -92559604281615349000000000000000000000000000000000000000000000.000000,y is -92559604377396321000000000000000000000000000000000000000000000.000000 x value is -92559604281615349000000000000000000000000000000000000000000000.000000,y value is -92559604377396321000000000000000000000000000000000000000000000.000000 min is -92559604377396321000000000000000000000000000000000000000000000.000000,max is -92559604281615349000000000000000000000000000000000000000000000.000000 直接给a,b赋值是正确的。 x value is 1.000000,y value is 2.000000 min is 1.000000,max is 2.000000 #include<stdio.h> #include<stdlib.h> void change(double* x, double* y); int main(void) { double a,b; scanf("%f,%f",&a,&b); printf("x is %f,y is %f\n",a,b); change(&a, &b); a = 1.0; b = 2.0; change(&a, &b); system("pause"); } void change(double* x, double* y) { double min,max; min = *x; max = *y; if(*x > *y) { min = *y; max = *x; } printf("x value is %f,y value is %f\nmin is %f,max is %f\n",*x,*y,min,max); }
C++模版函数的定义中的形参一定要用引用吗
老师是这样讲的: template<class 数据类型参数标识符> <返回类型><函数名>(参数表) { 函数体 } template<typename T> T fuc(T x, int y) { T x; //…… } 如果主调函数中有以下语句: double d; int a; fuc(d,a); 则系统将用实参d的数据类型double去代替函数模板中的T生成函数: double fuc(double x,int y) { double x; //…… } 然后我是这么写的 template<typename T> T min(T x, T y) { return (x<y)?x:y; } main() { cout<<min(1.1,2.4); } 编译不能通过,居然提示 1>------ Build started: Project: test, Configuration: Debug Win32 ------ 1>Compiling... 1>test.cpp 1>.\test.cpp(77) : error C2668: 'min' : ambiguous call to overloaded function 1> .\test.cpp(18): could be 'T min<double>(T,T)' 1> with 1> [ 1> T=double 1> ] 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(3197): or 'const _Ty &std::min<double>(const _Ty &,const _Ty &)' 1> with 1> [ 1> _Ty=double 1> ] 我开始怎么看都找不到错在哪里,在我看来参数类型很明确了,然后我看了别人的例子,想了下,把模版定义的参数改成了引用 T min(T &x, T &y) 这样就行了,但是我并不明白为什么,这模版函数里也没有一定要改变形参值的语句,只是取数的话,不是直接(T x,T y)就行了么,老师也是这么讲的啊,为什么不行啊。用T min(const T &x,const T &y)也不行
编写函数计算存放在数组ary中的10个数据的均方根误差
**原问题:** 计算序列数据的均方误差.均方误差(Mean Squared Error, MSE)是衡量“平均误差”的一种较方便的方法,可以评价数据的变化程度。均方根误差是均方误差的算术平方根。对于N1,....Nm,设N=(N1+...+Nm)/m;则均方根误差记作:t=sqrt(((N^2-N1^2)+...+(N^2-Nm^2))/(m(m-1)));(这里N^2表示N的平方)。编写函数float rmse(float * a, int n)计算存放在数组ary中的10个数据的均方根误差,这里a为存放数据的数组,n是数组中数据个数。在主调函数中调用该函数,并在主调函数中输出结果。_
递归函数里面直接printf为什么结果就变了
![图片说明](https://img-ask.csdn.net/upload/201705/13/1494649961_559845.jpg) ![图片说明](https://img-ask.csdn.net/upload/201705/13/1494649974_536684.jpg) 如图,为什么递归的结果返回了主调函数是正确的 而直接在递归函数里print结果就变了
关于返回函数内部new分配的内存的引用
#include <iostream> using namespace std; class example { public: example() { num = new int; *num = 10; cout<<"num = "<<*num<<endl; cout<<"构造"<<endl; } ~example() { cout<<"析构"<<endl; delete num; } void pingfang() { *num *= *num; } void print() { cout<<*num<<endl; } private: int *num; }; example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } int main(void) { example & e1 = diaoyong1(); e1.print(); delete &e1; example * ptr = diaoyong2(); ptr->print(); delete ptr; getchar(); return 0; } char *&alloc(){ char *va = new char [100]; return va;} 对于这样的程序 执行过程为 进入函数alloc 为变量va分配内存 假设为0x12345678 大小为四个字节 (32位机指针) 执行new操作 在内存0x12345678地址存入申请到的内存地址 假设为0x45670abc 也就是说 *(0x12345678)=0x45670abc 以上部分应该很好理解 然后返回va 也就是返回上一层一个值 这个值不可能是悬空的 它需要一个地址来存 由于是引用返回,所以返回的地址实际上就是变量va的地址0x12345678 退出函数 释放临时变量 包括va的地址0x12345678 返回到主调函数,使用返回值 比如赋值 a=alloc(); 相当于执行操作 a=*(0x12345678) 注意 在上一步 这个地址已经被释放了 所以当前这个地址存的是什么东西是不确定的 可能还是0x45670abc 也可能已经有了变化 这样a的值就不一定是你需要的了 结果也就可能是错的 关键在于退出函数 释放内存 使用内存这步 先释放 后使用 于是出错 如果是全局/静态变量 自然不会有这个问题 因为内存依旧被原来变量占用 类似引用做参数也是同样的效果 example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } 我想问上面的两个函数有什么不同?函数返回值到底是怎么实现的?如果返回一个指针是不是就是将储存这个指针的地址返回回来,函数怎么返回和左值是什么类型是不是有关系?局部变量的指针在函数结束的时候被释放是不是储存这个指针的地址释放了这个指针? example & e1 = diaoyong1(); example * e1 = diaoyong1(); //这两个本质上有什么区别,第一个为什么不会造成内存的泄露?
求解不用VC运行程序后出现断言失败的问题
这段C语言程序是C语言课的一个实训作业 在编译器中可以正常运行,但是当想通过exe文件直接打开时,在选择从文件导入这一环节会出现断言失败的提示,截图如下![图片说明](https://img-ask.csdn.net/upload/201906/29/1561803504_905506.png) 上面说是fscanf函数断言失败,之前遇到这种问题都是因为文件打开失败,但是这个程序在编译器里文件就能打开,直接用应用文件就会失败,这是什么原因呢?求教大佬 从文件导入的函数如下 ``` int myInsert_to_file() {STUlist*p1; FILE*fp1; p1=head; fp1=fopen("USER\\Allclass.txt","w+"); while(p1!=NULL) {fprintf(fp1,"%lu %d %s\n",p1->number,p1->Class,p1->name ); p1=p1->next ; } fclose(fp1); return 1; } ``` 主调函数如下 ``` #include "mydelete.h" #include "myinsert.h" #include "mysearch.h" #include "mybuild.h" #include <stdlib.h> #include <string.h> extern STUlist*head; int main() { int choice1,choice2; char China[10];//输入汉字用 unsigned long int number; enum symbol1{del=1,inse,seek,change,out}; enum symbol2{hand=1,file}; printf("******************\n欢迎来到学生证管理系统\n******************\n"); printf("删除文件,请键入1\n添加文件,请键入2\n查找信息,请键入3\n修改信息,请键入4\n将信息导入文件,请键入5\n"); part1 :printf("请输入您的选择:"); scanf("%d",&choice1); printf("\n"); getchar();//吸收回车 if(head==NULL)//检索数据库中是否有数据 {printf("检索到数据库为空,是否添加数据?(输入 是or否)"); scanf("%s",&China); if(strcmp(China,"否")==0) exit(0);//退出文件 else if(strcmp(China,"是")==0) {printf("请选择输入文件的方式\n若手动添加,则键入1\n若从文件导入,则键入2\n"); scanf("%d",&choice2); switch(choice2) {case hand://手动输入 { printf("输入格式为:\n学生证号:\n班级:\n姓名:\n若输入结束,则在本次输入的姓名处加#\n"); printf("范例:\n20185527\n1\n郭雨龙#\n"); myBuild_hand();//进行手动输入数据 }break;//选择hand的下括号 case file://文件输入 { myBuild_file(); printf("**********\n导入完成\n**********\n");}break; }//switch的下括号 goto part1; }//选择是的elseif的下括号 else {printf("ERROR!!\n请重新输入"); goto part1;}//选择不是‘是’或‘否’的else的下括号 }//检索数据库中是否有数据的下括号 switch(choice1) { case del: {printf("删除:请输入学生证编号"); scanf("%d",&number); if(number>99999999||number<10000000)//输入的学生证号码位数有误 printf("**********\nERROR:输入的学生证号码位数有误\n**********\n"); else {if(myDelete(number)!=0) printf("**********\n删除完成\n**********\n"); else printf("**********\nERROR:未找到此信息!\n**********\n");} goto part1;}break; case inse:{ myInsert(); printf("**********\n插入完成\n**********\n"); goto part1;}break; case seek: {int seek_choice; enum{seek_person=1,seek_class}; printf("**********\n查询个人信息,请键入1\n查询班级,请键入2\n**********\n"); scanf("%d",&seek_choice); switch(seek_choice) {case seek_person: {printf("请输入学生证号"); scanf("%lu",&number); if(number>99999999||number<10000000)//输入的学生证号码位数有误 printf("**********\nERROR:输入的学生证号码位数有误\n**********\n"); else { if(mySearch(number)!=0) printf("**********\n查找完成\n**********\n"); else printf("**********\nERROR:未找到此条信息!\n**********\n");} goto part1;//结束则返回最初 }break; case seek_class: {int the_class; printf("请输入班级号(1~5)\n"); scanf("%d",&the_class); if(the_class<1||the_class>5)//输入的班级码有误 printf("**********\nERROR:输入的班级码有误\n**********\n"); else {if(mySearch_class(the_class)!=0) printf("**********\n查找完成\n**********\n"); else printf("**********\nERROR:未找到此条信息!\n**********\n");} goto part1;//结束则返回最初 }//seekclass的下括号 }//seekswitch的下括号 }//caseseek的下括号 case change: {printf("请输入学生证号"); scanf("%lu",&number); mychange(number); printf("**********\n重置成功\n**********\n"); goto part1; }break; case out: {myInsert_to_file(); printf("**********\n已将现有信息导入文件\n**********\n"); goto part1; }break; default:{printf("**********\nERROR:您输入的信息有误!\n**********\n\n"); goto part1; }break; } return 0; }//主函数的下括号 ```
linux下free(): invalid next size (fast)的问题
简单来说就是把mac地址转换成00:00:00:00:00:00这种形式,被调函数在for循环i=1时还很正常,i=2的时候执行到macValue += buffer这句话就挂了,报错 free(): invalid next size (fast),实在是找不到原因了,谷歌说内存泄露,可是我实在不知道string这里怎么泄露啊,求各位帮忙看看啊 不胜感激!(另外,我用小程序测试过这段代码完成没问题啊,可是放到大程序里面就不行了,嘤嘤嘤) 主调函数部分 rule.fieldValue[DL_SRC] = ::getMacValueAsString(ofm->match.dl_src); 被调用函数: string getMacValueAsString(const uint8_t* macAddress) { string macValue ; char buffer[8]; for(int i = 0; i < OFP_ETH_ALEN; i++) { uint8_t upperNibble = macAddress[i] >> 4; uint8_t lowerNibble = macAddress[i] & (uint8_t)0xF; sprintf(buffer, "%x%x", upperNibble, lowerNibble); macValue += buffer; cout<<"macValue:"<<macValue<<endl; if(i != (OFP_ETH_ALEN - 1)) { macValue+=':'; } } return macValue; }
verilog数码管静态显示计数器
最近刚上手数字电路实验,很多地方都不懂,实验课要求做出数码管静态显示计数器。自己写了一段代码也没报错,但是上basys3板子就行不通。 总体思路如下: 1: 计数模块 ``` module cnt( input clk1, output reg[3:0] cnt ); reg [27:0] times; initial times = 28'b0; always@(posedge clk1) begin if(times == 5000000) begin times = 28'b0; cnt = cnt + 4'b1; end else times = times + 28'b1; end endmodule ``` #####2: 数码管显示模块 ``` module seg( input clk2, input [3:0] cnt, output[6:0] seg ); reg [6:0] r_seg; assign seg = r_seg; always @(*) begin case(cnt) 4'b0000: r_seg = 7'b1111110; 4'b0001: r_seg = 7'b0000110; 4'b0010: r_seg = 7'b1101101; 4'b0011: r_seg = 7'b1111001; 4'b0100: r_seg = 7'b0110011; 4'b0101: r_seg = 7'b1011011; 4'b0110: r_seg = 7'b1011111; 4'b0111: r_seg = 7'b1110000; 4'b1000: r_seg = 7'b1111111; 4'b1001: r_seg = 7'b1111011; 4'b1010: r_seg = 7'b1110111; 4'b1011: r_seg = 7'b0011111; 4'b1100: r_seg = 7'b1001110; 4'b1101: r_seg = 7'b0111101; 4'b1110: r_seg = 7'b1001111; 4'b1111: r_seg = 7'b1000111; default: r_seg = 7'b1111111; endcase end endmodule ``` 3:主调用模块 ``` module top( input clk_in1, output [6:0] seg_display ); wire r_cnt; wire clk1_cnt; wire clk2_seg; clk_wiz_0 instance_name ( // Clock out ports .clk_out1(clk1_cnt), // output clk_out1 .clk_out2(clk2_seg), // output clk_out2 .clk_in1(clk_in1) ); // input clk_in1 cnt instance_cnt( .cnt(r_cnt), .clk1(clk1_cnt) ); seg instance_seg( .seg(seg_display), .cnt(r_cnt), .clk2(clk2_seg) ); endmodule ``` 现在主要由以下问题: 1. 我上板之后发现有跳动,但一直都是 E(且七个段颜色不一) 2. 如果要加使能信号,是4个数码管中只有一个 在跳动,那我应该把它放在主文件中当作输入吗?还是在seg这个module中呢? 如果能被解答就太感谢了 !因为被学校强制要求上这个课我也很无奈,自己啥也不会 ,还在学习中。。 PS 标签实在是在不到verilog,好尴尬。。。随便贴了一个,见谅。。
c#界面问题,按钮边框白边如何去除。
这几天学校实训,给我们小组安排的是一个类似仓库功能(出库,入库,查询)的小程序,程序已经做出来.软件主调色彩是金属黑。按钮那些都是黑色,但是按钮边框的的白边怎么都去不了。(不是图片问题,图片背景是透明的。)百度到解决方案是"borderStyle 设置为:none borderColor 设置为:transparent(透明)"其中找不到borderstlye这个选项,bordercolor设置为transparent时出错。(ButtonBase 控件不支持将 BorderColor 设置为 Transparent。)然后想到了重绘按钮。但是找不到重绘按钮的代码。希望有能力的高手能给出一个去掉按钮的边框白边的方案。谢谢。
图的广度优先遍历问题求教
该程序运用邻接矩阵创建图,运行后没有出现图的广度优先遍历的结果的打印。。。请大神帮忙看看我写的广度优先遍历算法哪里出现了问题,万分感激! #include "stdafx.h" #include <iostream.h> #include <conio.h> #include <stdio.h> #include <queue> using namespace std; void EnQueue_Sq( queue<int> &Q , int v ) { Q.push( v ); } int DeQueue_SQ( queue<int> &Q ) { int i = Q.front(); Q.pop(); return i; } //1、邻接矩阵 #define VexType char #define EdgeType int #define INFINITY INT_MAX // 最大值∞ #define Max_Vertex_Num 10 // 最大顶点个数 bool visited[ Max_Vertex_Num ];//辅助数组--遍历使用 struct MGraph{ VexType vexs[ Max_Vertex_Num ]; //顶点数组 EdgeType edges[ Max_Vertex_Num ][ Max_Vertex_Num ];//邻接矩阵 int vexnum; //当前顶点数 int edgenum; //当前边数 //GraphKind kind;//图的种类标志,本练习假定图为无向带权图(即 无向网) }; void DSF_MG( const MGraph &G , int v ); void BFS_MG( const MGraph &G , int v ); /////////////////////////////算法实现///////////////////////////////////// //一、邻接矩阵操作的实现 //1、 创建图 void CreateGraph_MG( MGraph &G )//构造一个具有n个顶点,e条边的无向网(注意:输入必须准确,算法中没有判断非法输入!) { cout<<"请分别输入顶点数目和边的数目:"; cin>>G.vexnum>>G.edgenum; int n = G.vexnum; int e = G.edgenum; int i , j; for (i = 0 ; i < n ; i ++ ) { cout<<"请输入第"<<i<<"个顶点的信息:"; cin>>G.vexs[ i ]; } //初始化邻接矩阵 for ( i = 0 ; i < n ; i ++ ) for ( j = 0 ; j < n ; j ++ ) { G.edges[i][j] = INFINITY; } for ( i = 0 ; i < e ; i ++ ) { int beginNode , endNode; cout<<"请输入第"<<i<<"条边的第一个顶点的编号(从0开始):"; cin>>beginNode; cout<<"请输入第"<<i<<"条边的第二个顶点的编号(从0开始):"; cin>>endNode; cout<<"请输入第"<<i<<"条边的权值(注意为非0值):"; cin>>G.edges[beginNode][endNode]; G.edges[endNode][beginNode] = G.edges[beginNode][endNode]; } //输出图的信息 cout<<"输入完毕!"<<endl; cout<<"顶点数组:["; for (i = 0 ; i < n ; i ++ ) { cout<<G.vexs[ i ]<<" "; } cout<<"]"<<endl; cout<<"邻接矩阵:"<<endl; for ( i = 0 ; i < n ; i ++ ) { for ( j = 0 ; j < n ; j ++ ) { if( G.edges[ i ][ j ] != INFINITY ) printf( "%5d" , G.edges[i][j] ); else printf( "%5c" , '-'); //cout<<G.edges[i][j]<<" "; } //cout<<endl; printf( "\n" ); } } //2、求邻接结点及其度 void Dsp_ArjNodes_MG( const MGraph &G , int v )//输出第v个顶点的所有邻接点信息以及该结点的度(注意i不在取值范围内应提示错误信息) { if(v>=G.vexnum) cout<<"ERROR"<<endl; int count = 0; for(int i=0;i<G.vexnum;i++) { if(G.edges[v-1][i]!=INFINITY){ cout<<"临界结点有"<<i<<endl; count++; } } cout<<"该点的度为"<<count<<endl; } //3、找邻接点 int FirstAdjVex( const MGraph &G , int v )//找到顶点v(v为顶点的index)的第一个邻接点并返回该邻接点的index,如果不存在邻接点,则返回-1 { int j,p=-1,found=1; for(j=0;((j<G.vexnum)&&(found==1));j++) if(G.edges[v][j]!=INFINITY) { p=j; found=0; } return p; } //4、找下一个邻接点 int NextAdjVex( const MGraph &G , int v , int w )//v是G的某个顶点,w是v的一个邻接点,返回v(相对于w)的下一个邻接点(邻接点的index),如果w已经是最后一个邻接点,则返回-1 { int j,p=-1,found=1; for(j=w+1;((j<G.vexnum)&&(found==1));j++) if(G.edges[v][j]!=INFINITY) { p=j; found=0; } return p; } //5、广度优先遍历(主调)--例子 void BFSTraverse_MG( const MGraph &G )//广度优先遍历图 { int v; for (v=0; v<G.vexnum; ++v) visited[v] = false; //初始化访问标志 //开始遍历过程: for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) BFS_MG( G , v ); } //6、以v为起点广度优先遍历(核心函数) void BFS_MG( const MGraph &G , int v )//以v为起点进行广度优先遍历 { queue<int> Q;//定义完队列Q(不需要执行InitQueue_SQ) EnQueue_Sq(Q, v); // v入队列 visited[v] = true; cout<<G.vexs[v]<<" "; while(!Q.empty ()) { int s = DeQueue_SQ( Q );// 队头元素出队 for(int w=FirstAdjVex(G,s);w!=INFINITY;w=NextAdjVex(G,s,w)) if ( !visited[w] ) { visited[w]=true; cout<<G.vexs[w]<<" "; EnQueue_Sq(Q, w); // 访问的顶点w入队列 } // if }//while } void main() { MGraph MG; CreateGraph_MG( MG ); // 打印顶点a的所有邻接点 Dsp_ArjNodes_MG( MG ,3); cout<<"输出广度优先遍历结果:"<<endl; BFSTraverse_MG( MG ); getch(); }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
五年程序员记流水账式的自白。
不知觉已中码龄已突破五年,一路走来从起初铁憨憨到现在的十九线程序员,一路成长,虽然不能成为高工,但是也能挡下一面,从15年很火的android开始入坑,走过java、.Net、QT,目前仍处于android和.net交替开发中。 毕业到现在一共就职过两家公司,目前是第二家,公司算是半个创业公司,所以基本上都会身兼多职。比如不光要写代码,还要写软著、软著评测、线上线下客户对接需求收集...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
一文详尽系列之模型评估指标
点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
程序员该看的几部电影
1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!!
去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利。时隔一年的今天,阿里云正式发布了 Visual Studio Code 版本,全面覆盖前端开发者,帮助前端实现一键打包部署,让开发提速 8 倍。 VSCode 版本的插件,目前能做到什么? 安装插件之后,开发者可以立即体验...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
2019年除夕夜的有感而发
天气:小雨(加小雪) 温度:3摄氏度 空气:严重污染(399) 风向:北风 风力:微风 现在是除夕夜晚上十点钟,再有两个小时就要新的一年了; 首先要说的是我没患病,至少现在是没有患病;但是心情确像患了病一样沉重; 现在这个时刻应该大部分家庭都在看春晚吧,或许一家人团团圆圆的坐在一起,或许因为某些特殊原因而不能团圆;但不管是身在何处,身处什么境地,我都想对每一个人说一句:新年快乐! 不知道csdn这...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了掌握好Android打下基础。
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
【CSDN学院出品】 你不可不知的JS面试题(分期更新……)
1、JS中有哪些内置类型? 7种。分别是boolean、number、string、object、undefined、null、symbol。 2、NaN是独立的一种类型吗? 不是。NaN是number类型。 3、如何判断是哪个类型? Object.prototype.toString.call(),返回为[object Type]。 现在我们来验证一下。 Object.prototype.toS...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
Git笔记(3) 安装配置
Git的安装,基础配置以及如何获取帮助
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问