C语言怎么区分全局变量声明和全局变量定义

在学习《C程序设计》第五版唐浩强著,有几个问题:

1.书上讲声明可以省略类型说明符,比如extern int a可以写成extern a,但是我到VS2005运行却有错误,可能他用的是VC++6.0吧,是这个原因吗?

2.怎么区分全局变量声明和全局变量定义,定义肯定是在所有函数外面,但声明是可以在里面也可以在外面的,而在形式上,定义是int a,但是我看冯艳茹主编《C语言程序设计》国防科技大学出版社2017年6月第一版,这本书讲也可以加extern,extern int a等效于int a。而对于声明,形式也是extern int a(当然也可以写成extern a),也就是说定义和声明形式可能在形式上会是一样的,即都可以写成extern int a,那么在位置(即在函数里面还是外面)上定义声明都可以在外面,形式也可能一样,那么怎么区分,例如定义声明都在函数之外,形式都是extern int a,这符合上述规则,那怎么区分,有没有大神能给我讲清这里的原理?

万分感谢!

4个回答

我写的时候,给全局变量赋值的定义时“int a",是在函数外面的;而需要用它的值的地方,则在函数里面”extern int a",希望有所帮助。

int a不管写在哪里都是变量定义
extern int a是为了防止重定义只声明这个变量,一般在头文件或者在其它.c文件里面。主要是.c文件间相互引用全局变量

另外我没见过哪种编译器支持extern a的写法,我见过的都是带类型的

一般需要使用外部变量时(即非同个模块文件定义的变量)才会去使用extern关键字。

一般写在同一个.C文件且在主函数上面,则在这个.C中都可以调用。如果主要在其他.C文件中使用,使用前在声明区加上extern

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言简单的全局变量定义问题
请问为什么我在函数外面定义了全局变量,变量的值没有改变?![图片说明](https://img-ask.csdn.net/upload/201510/11/1444536901_739735.png)
C语言中多文件的全局变量声明问题
具体问题请麻烦看链接 [C语言遇到问题](http://blog.csdn.net/u013610563/article/details/50727619 "") 我写了一个函数void match(char* list)/*作用是在list字符串中查找给定子字符串*/ 又写了一个函数void find(void (*match)(char*))/*因为想用函数指针,就把match函数传递进去了 然后find()函数遍历字符串数组。 最后在main()函数中写字符串数组char* shuzu[]的具体内容 然后把match函数,find函数,main函数保存在不同的.c文件中 最后写了一个头文件,其中保存了函数申明,还有那个字符串数组的申明 我是这样写的extern char* shuzu[]; 最后遇到的问题是编译时告诉我find()函数遇到未定义变量shuzu[],,可我不是把它定义成 全局变量保存在头文件中了吗?
C语言全局变量和静态全局变量和局部变量和静态局部变量在初始化和未初始化时生存期和作用域的具体情况怎么样?
最近看《C程序设计》第五版唐浩强著对静态局部变量有这样一段: > 对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。 >如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初植 0(对数值型交量)或空字符'\0'(对字符变量)。 这里讲静态局部变量在编译赋初值,没有初值自动赋初植 0(对数值型交量)或空字符'\0'(对字符变量)。应该是在编译就分配了空间 在对生存期和作用域解释时又有这样的例子,如图 ![图片说明](https://img-ask.csdn.net/upload/201909/15/1568503873_431314.jpg) 这里讲静态局部变量c的生存期从它所在的函数开始,书上讲“如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的生存期,获称该变量在此时刻“存在”“,似乎是说这个静态局部变量从它所在的函数开始才开始在内存分配空间。 是不是赋初值和在内存开辟空间是两个过程,网上有些东西好像是这个意思。还有对全局变量是不是也是编译赋初值?没有初值是不是自动给它赋值(网上好像有这么讲的),那什么时候在内存开辟空间呢(这个图上的生存期从main函数就开始)? 这些可能涉及计算机组成原理,我没学过,希望哪位高手能详细解释下,万分感谢!!!
C语言的static全局变量有什么意义?
.h文件中的全局变量用了static修饰,但被其它文件包含后,这个static全局变量还是可以被其它文件访问,那我声明为static有什么意义? 怎样才能让我的头文件在被其它文件包含后其中的全局变量不被这个文件访问到?
在C语言编程中,我定义的全局变量足有2M大小,但生成的程序只有20k,怎么回事?
在C语言编程中,我定义的全局变量足有2M大小,但生成的程序只有20k,怎么回事?
c语言,为什么我定义了一个全局变量,总是会自动变为零?
``` #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<conio.h> int score=0,move=0,a[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},temp[5],highest_score=0; void print(void) { int i,j; system("cls"); printf(" ___________________2048________________\n"); printf(" ------------how to play?----------\n"); printf(" A---left,D-right,W---up,S---down,0---exit\n"); printf(" ----------------------------------\n"); printf(" highest score:%d\n",highest_score); printf(" ----------------------------------\n"); printf(" score:%d move:%d \n",score,move); for(i=0;i<4;i++) { printf(" |-------------------|\n"); printf(" "); for(j=0;j<4;j++) { if(a[i][j]==0) printf("| "); else printf("|%-4d",a[i][j]); if(j==3) printf("|\n"); } } printf(" |-------------------|\n"); } int add() { int i,j,t=1,change=0; while(t<=3) { for(i=0;i<3;i++) { if(temp[i]==0) { if(temp[i]!=temp[i+1]) change=1; temp[i]=temp[i+1]; temp[i+1]=0; } } t++; } for(i=0;i<3;i++) { if(temp[i]==temp[i+1]) { if(temp[i]!=0) { change=1; score=score+temp[i]; } temp[i]=temp[i]*2; temp[i+1]=0; } } t=1; while(t<=3) { for(i=0;i<3;i++) { if(temp[i]==0) { temp[i]=temp[i+1]; temp[i+1]=0; } } t++; } return change; } int main() { int change=1,gameover=0,i,j; char input; srand((unsigned)time(NULL)); while(gameover==0) { if(change>=1) { do { i=((unsigned)rand())%4; j=((unsigned)rand())%4; }while(a[i][j]!=0); if(((unsigned)rand())%2==0) a[i][j]=2; else a[i][j]=4; } print(); input=getch(); change=0; if(input=='0') { printf("Do you really want to exit this game?Y/N\n"); input=getch(); if(input=='y'||input=='Y') break; } else if(input=='w'||input=='W') { for(j=0;j<4;j++) { for(i=0;i<4;i++) temp[i]=a[i][j]; temp[5]=0; change+=add(); for(i=0;i<4;i++) a[i][j]=temp[i]; } move++; } else if(input=='s'||input=='S') { for(j=0;j<4;j++) { for(i=0;i<4;i++) temp[i]=a[3-i][j]; temp[5]=0; change+=add(); for(i=0;i<4;i++) a[i][j]=temp[3-i]; } move++; } else if(input=='a'||input=='A') { for(i=0;i<4;i++) { for(j=0;j<4;j++) temp[j]=a[i][j]; temp[5]=0; change+=add(); for(j=0;j<4;j++) a[i][j]=temp[j] ; } move++; } else if(input=='d'||input=='D') { for(i=0;i<4;i++) { for(j=0;j<4;j++) temp[j]=a[i][3-j]; temp[5]=0; change+=add(); for(j=0;j<4;j++) a[i][j]=temp[3-j]; } move++; } gameover=1; for(i=0;i<4;i++) for(j=0;j<4;j++) { if(a[i][j]==0) gameover=0; } if(gameover==1) { for(i=0;i<3;i++) for(j=0;j<3;j++) if(a[i][j]==a[i+1][j]||a[i][j]==a[i][j+1]) gameover=0; for(i=0;i<3;i++) if(a[3][i]==a[3][i+1]||a[i][3]==a[i+1][3]) gameover=0; } if(gameover==1) { printf("Do you want to try again?Y/N"); input=getch(); if(input=='Y'||input=='y') { gameover=0; memset(a,0,sizeof(a)); change=1; if(score>highest_score) highest_score=score; score=0; move=0; } else if(input=='n'||input=='N') gameover=1; } } printf("\n Game over!\n"); getch(); return 0; } ``` 就是highest_score这个全局变量,为什么每次重新开始游戏的时候只在按过Y之后才会显示为score的值,之后一旦进行了一次操作,就右边为了0?而且我发现只要把它改为一个非零的数,就一切正常,这是为什么?
vscode,c语言编程,如何设置token,区分全局变量和局部变量的颜色?
已经参看过 https://macromates.com/manual/en/language_grammars 还是没有找到合适的方法 另外,我这边找问题标签,还没有vscode,建议添加
Vscode如何设置局部变量和全局变量为不同颜色
如题,VSCODE编辑器做C语言开发的时候, 默认配置局部变量和全局变量是同一个颜色。有没有办法配置它像SI一样,用不同的颜色区分?
有关C语言中基于全局变量对二叉树的创建和遍历的问题
#include<stdio.h> #include<stdlib.h> #define max 100 typedef struct node { char date; struct node *lchild,*rchild; }tree,*TREE; tree *DLR=NULL; void creatDLR() { //先序递归方式创建树 char date; date=getchar(); if(date=='#')DLR=NULL; else { if(!(DLR=(tree*)malloc(sizeof(struct node)))) {printf("先序递归创建树失败");exit(1);} DLR->date=date; creatDLR(DLR->lchild); creatDLR(DLR->rchild); } } void showDLR() { //先序递归遍历二叉树 if(DLR) { printf("%c",DLR->date); showDLR(DLR->lchild); showDLR(DLR->rchild); } } int main() { creatDLR(); showDLR(); } 这是我的源码,我的想法是这样的。先利用creatDLR()函数把创建树后的根节点存储在全局变量,再利用showDLR()通过全局变量遍历树。可是为什么不行呢?
STM32L051全局变量死机,但确定不是堆栈问题,请教原因和解决办法?
项目使用STM32L051C8T6,遇到一个奇怪问题:当增加全局变量或将全局数组增大(仅是从7个数组元素增加到10个)或将某段代码定义为函数进行调用时,程序都会100%死机(不是偶尔死机),有时某个全局变量的值还被莫名修改。此现象极象RAM空间不够或堆栈溢出,但试将堆栈由默认的1024增加到4096仍要死机。编译信息如下:Program Size: Code=36456 RO-data=808 RW-data=384 ZI-data=2688 。请高手指点原因何在?如何解决?不胜感激!
关于指针全局变量和局部变量存储位置的问题
想问一下,修改下面代码中的全局变量后,在打印pstr变量时,为什么在反汇编代码中看到callq 5e0 <__stack_chk_fail@plt>(栈检查失败),这是pstr的地址指向出现了问题吗,求大佬详细地解答 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> char cstr[100]="xyz"; char *pstr="xyz"; int main() { char id[100]="123456"; strcpy(cstr,id); strcpy(pstr,id); printf("%s\n",cstr); printf("%s\n",pstr); return 0; } ```
【C语言】一道简单的局部变量和全局变量的题
``` #include <stdio.h> int main(){ int a=1,b=3; { int a=1,c=2; a=a+b; b=c+a; printf("a=%d,b=%d\n",a,b); } printf("a=%d,b=%d\n",a,b); return 0; } ``` 编译器输出是 a=4,b=6 a=1,b=6 请问第二个输出的时候,为什么b是6呢
基础的C语言小问题,定义函数
定义一个无参函数 void lr(int CJ[],int n) 其中这个 (int CJ[],int n) 怎么理解 (1)在程序中定义一个全局变量N用于存放学生人数,再定义一个一维的全局数组CJ[100],用于存放学生成绩。 (2)编写一个成绩录入函数lr(),lr()是没有返回值的无参函数。函数中首先输入学生人数放入全局变量N中,再录入N个学生的成绩(下标对应学生的学号1~N),放到全局数组CJ[100]中。(录入时要提示输入几号学生的成绩,成绩录完时要提示“成绩已经录完!”) (3)编写一个打印成绩函数dy(),dy()是没有返回值的无参函数,功能是根据N的值输出全局数组CJ[100]中的N个学生的学号和成绩。 (4)在主函数中调用函数lr(),录入5个学生的成绩,然后调用函数dy(),输出这5个学生的学号和成绩。 这个题写了一半,没有思路了,求救一下大佬们
初学C语言,为什么这个x值是全局变量的1,而不是main函数里的5?
![图片说明](https://img-ask.csdn.net/upload/201907/14/1563103060_604792.png)![图片说明](https://img-ask.csdn.net/upload/201907/14/1563103070_884721.png)![图片说明](https://img-ask.csdn.net/upload/201907/14/1563103982_402836.png) c函数里面没有定义x,但是c函数不是在main函数里吗?局部变量x=5的作用域是main函数,不是应该包含c函数吗? 初学C,问题可能很幼稚,希望各位帮忙解答一下,谢谢!
对全局变量的具体使用
#include<stdio.h> int n=0; void hanoi1(int num, char a, char b, char c) { //int n=0; if (num == 1) printf("第%d步:%c-->%c\n",++n,a,c); else { hanoi1(num - 1, a, c, b); printf("第%d步:%c-->%c\n", ++n, a, c); hanoi1(num - 1, b, a, c); } } int main() { int num,x,n; printf("请输入盘子总数:"); scanf("%d", &num); hanoi1(num, 'A', 'B', 'C'); }![图片说明](https://img-ask.csdn.net/upload/201903/17/1552795009_198680.png)![图片说明](https://img-ask.csdn.net/upload/201903/17/1552795017_954664.png) 为什么这里变量n在不同的位置最后结果不同呢?对全局变量的理解还不是很清楚,求大佬zhi'jiao
新手请教一下c语言变量定义的问题
我的工程里有3个.cpp和2个.h,在cpp文件里定义了几个全局变量,然后两个cpp里都引用了一个.h,结果build的时候就出现 already defined in ***.obj, conflicts with use of other libs, one or more multiply defined symbols found 报错信息如下 Main.obj : error LNK2005: "int (* iMap)[13]" (?iMap@@3PAY0N@HA) already defined in LessonX.obj Main.obj : error LNK2005: "bool g_bStart" (?g_bStart@@3_NA) already defined in LessonX.obj Main.obj : error LNK2005: "float g_fGameTime" (?g_fGameTime@@3MA) already defined in LessonX.obj Main.obj : error LNK2005: "int g_iScore" (?g_iScore@@3HA) already defined in LessonX.obj LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library ..\..\..\Bin\Game.exe : fatal error LNK1169: one or more multiply defined symbols found 执行 link.exe 时出错. LessonX.cpp的源代码如下: ///////////////////////////////////////////////////////////////////////////////// // // // // ///////////////////////////////////////////////////////////////////////////////// #include <Stdio.h> #include "CommonAPI.h" #include "LessonX.h" #include "List.h" //////////////////////////////////////////////////////////////////////////////// // int g_iGameState = 0; // 游戏状态,0 -- 游戏结束等待开始状态;1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中 struct Weapon* g_pMyTank =NULL; int iMap[11][13]; bool g_bStart = false; // 控制一局游戏开始true与结束false float g_fGameTime = 0.f; // 一局游戏的剩余时间 int g_iScore = 0; // 一局游戏得分 const float GAME_TIME = 30.f; // 一局游戏时间 const float CREATE_TANK_TIME = 5.f; // 每批次生成坦克的时间间隔 const float TANK_SPEED = 5.f; // 坦克速度 const float BULLET_SPEED = 8.f; // 子弹速度 const float FIRE_TIME = 2.f; // 坦克开炮时间间隔 const float WORLD_LEFT = -26.f; // 游戏场景边界左值 const float WORLD_TOP = -22.f; // 游戏场景边界左值 const float WORLD_RIGHT = 26.f; // 游戏场景边界左值 const float WORLD_BOTTOM = 22.f; // 游戏场景边界左值// // 游戏地图,0表示此处为空,1表示此处有墙。根据游戏空间大小、墙以及坦克大小, // 我们把地图分成11行,13列,每格大小刚好放一块墙。 // void GameInit(); void GameRun( float fDeltaTime ); void GameEnd(); void MoveMyTank(int iKey,bool bPress); //============================================================================== // // 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。 //============================================================================== // // 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次 // 用以处理游戏的开始、进行中、结束等各种状态. // 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒 void GameMainLoop( float fDeltaTime ) { switch( g_iGameState ) { // 初始化游戏,清空上一局相关数据 case 1: { GameInit(); g_iGameState = 2; // 初始化之后,将游戏状态设置为进行中 } break; // 游戏进行中,处理各种游戏逻辑 case 2: { // TODO 修改此处游戏循环条件,完成正确游戏逻辑 if( true ) { GameRun( fDeltaTime ); } else { // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态 g_iGameState = 0; GameEnd(); } } break; // 游戏结束/等待按空格键开始 case 0: default: break; }; } void MoveMyTank(int iKey,bool bPress) { if(bPress&&g_pMyTank!=NULL) { switch(iKey) { case KEY_W: g_pMyTank->iDir=UP; g_pMyTank->fSpeedX=0.f; g_pMyTank->fSpeedY=-TANK_SPEED; break; case KEY_S: g_pMyTank->iDir=DOWN; g_pMyTank->fSpeedX=0.f; g_pMyTank->fSpeedY=TANK_SPEED; break; case KEY_A: g_pMyTank->iDir=LEFT; g_pMyTank->fSpeedX=-TANK_SPEED; g_pMyTank->fSpeedY=0.f; break; case KEY_D: g_pMyTank->iDir=RIGHT; g_pMyTank->fSpeedX=TANK_SPEED; g_pMyTank->fSpeedY=0.f; break; default: break; } dSetSpriteLinearVelocity("player",g_pMyTank->fSpeedX, g_pMyTank->fSpeedY); dSetSpriteRotation("player",g_pMyTank->iDir*90); } } //============================================================================== // // 每局开始前进行初始化,清空上一局相关数据 void GameInit() { } //============================================================================== // // 每局游戏进行中 void GameRun( float fDeltaTime ) { } //============================================================================== // // 本局游戏结束 void GameEnd() { } //========================================================================== // // 鼠标移动 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnMouseMove( const float fMouseX, const float fMouseY ) { } //========================================================================== // // 鼠标点击 // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) { } //========================================================================== // // 鼠标弹起 // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY ) { } //========================================================================== // // 键盘按下 // 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义 // 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下) void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress ) { if(iKey == KEY_SPACE && g_bStart == false) // 游戏未开始,按下空格键 { g_bStart = true; g_fGameTime = GAME_TIME; dSetSpriteVisible("start", false); dSetTextValue("time", (int)g_fGameTime); dSetTextValue("score", g_iScore); } } //========================================================================== // // 键盘弹起 // 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义 void OnKeyUp( const int iKey ) { } //=========================================================================== // // 精灵与精灵碰撞 // 参数 szSrcName:发起碰撞的精灵名字 // 参数 szTarName:被碰撞的精灵名字 void OnSpriteColSprite( const char *szSrcName, const char *szTarName ) { } //=========================================================================== // // 精灵与世界边界碰撞 // 参数 szName:碰撞到边界的精灵名字 // 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边 void OnSpriteColWorldLimit( const char *szName, const int iColSide ) { } List.h的源代码如下: ////////////////////////////////////////////////////////////// /////////////////////////// ////// // //////////////////////////// #ifndef _LIST_H_ #define _LIST_H_ ///////////////////////////// struct Weapon{ char szName[128]; // 精灵名称 float fPosX, fPosY; // 精灵坐标 float fSpeedX, fSpeedY; // X和Y方向上速度 float fFireTime; // 敌方坦克距下一次开炮的剩余时间 int iHp; // 生命值 int iDir; // 朝向:0 - 上方;1 - 右方;2 - 下方;3 - 左方 int iType; // 类型: 0 - 我方坦克;1 - 敌方坦克;2 - 我方 // 子弹; 3 - 敌方子弹 Weapon* pNext; // 指向下一个节点的指针 }; enum Direction{ UP = 0, // 上方 RIGHT = 1, // 右方 DOWN = 2, // 下方 LEFT = 3 // 左方 }; enum Role { MYTANK = 0, // 我方坦克 ENEMYTANK = 1, // 敌方坦克 MYBULLET = 2, // 我方子弹 ENEMYBULLET = 3 // 敌方子弹 }; extern int g_iGameState; // 游戏状态,0 -- 游戏结束等待开始状态;1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中 extern struct Weapon* g_pMyTank; extern int iMap[11][13]; extern bool g_bStart; // 控制一局游戏开始true与结束false extern float g_fGameTime; // 一局游戏的剩余时间 extern int g_iScore; // 一局游戏得分 #endif//_LIST_H_ 求问这要怎么办?
基础的C语言前来求助大佬们
这个写了一半写不出来,void函数调用不了,下面是这个问题 (1)在程序中定义一个全局变量N用于存放学生人数,再定义一个一维的全局数组CJ[100],用于存放学生成绩。 (2)编写一个成绩录入函数lr(),lr()是没有返回值的无参函数。函数中首先输入学生人数放入全局变量N中,再录入N个学生的成绩(下标对应学生的学号1~N),放到全局数组CJ[100]中。(录入时要提示输入几号学生的成绩,成绩录完时要提示“成绩已经录完!”) (3)编写一个打印成绩函数dy(),dy()是没有返回值的无参函数,功能是根据N的值输出全局数组CJ[100]中的N个学生的学号和成绩。 (4)在主函数中调用函数lr(),录入5个学生的成绩,然后调用函数dy(),输出这5个学生的学号和成绩。
C++中的类静态变量在delphi7中怎么实现。
请教一下,类TCat,TDog都是继承类TAnimal,我想自改TAnimal中myKind属性然后TCat和TDog实例中的MyKind都改了,怎么弄?? myKind是工程全局变量,cat:TCat;dog:TDog; 都能访问,现在想做个封装,封装到父类TAnimal中,
萌新学生,在线求大佬解答,c语言全局变量二维数组在主函数输入后,数组还是为零
#include<math.h> #include<stdio.h> #include<stdlib.h> #include<conio.h> double a[3][9]={{0},{0}}; void main() { printf("*************欢迎使用惠斯登电桥数据处理系统*************\n"); int t; double w; getchar(); printf("请输入你的数据"); printf("现在请输入第一组数据"); printf("倍率为"); scanf("%f",&a[0][0]); printf("%f\n",a[0][0]); ![图片说明](https://img-ask.csdn.net/upload/201906/30/1561862844_357178.png)
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问