精华内容
下载资源
问答
  • 原文:C语言static语句的详细说明 对于已经使用10年C语言的我来说,开发 NanShan即时通讯 的同时,还是比较喜欢深入学习C语言的。 C中的static 在进程开始运行时初始化,C中static修饰变量和函数 静态...

    原文:C语言static语句的详细说明

    对于已经使用10年C语言的我来说,开发 NanShan即时通讯 的同时,还是比较喜欢深入学习C语言的。

    C中的static

    在进程开始运行时初始化,C中static修饰变量和函数

    静态变量

    存储于全局变量区

    静态局部变量

    进程的运行过程中,函数退出不被销毁

    静态全局变量

    只能被本文件的函数调用访问,对其他源文件不可见

    静态函数

    只在声明它的文件中可见,对其他源文件不可见。定义时不加static


    作用总结:

    隐藏。对其他源文件不可见。与其他文件的同名函数或变量不存在冲突问题,降低模块间的耦合度。

    持久性,在进程运行过程中不释放

    如果不赋初始值,初始化默认值为0;



    C++中的static

    C++中的static面向过程的和C中的使用相同。

    面向对象中static的使用:静态数据成员和静态成员函数

    静态数据成员:同一类的所有实例对象共用同一个静态数据成员,不能在声明时定义,定义时分配空间

    定义格式:  <数据类型><类名>::<静态数据成员名>=<值>

    访问格式:<类对象名>.<静态数据成员名> 或 <类名>::<静态数据成员名>

    同全局变量相比,使用静态数据成员有两个优势:

    静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;

    可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

    静态成员函数:

    静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

    静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

    非静态成员函数可以任意地访问静态成员函数和静态数据成员;

    静态成员函数不能访问非静态成员函数和非静态数据成员;

    由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

    调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
    <类名>::<静态成员函数名>(<参数表>)

    小赢靠智,大赢唯德! --欢迎各位博友提宝贵意见,相互交流

    
    展开全文
  • C语言 switch语句举例说明(类比坐电梯来理解)

    万次阅读 多人点赞 2018-12-19 12:07:21
    我们把**使用switch语句的过程规律**想象成坐**电梯**(大家都有坐电梯的经历),每个**case语句**后面的标号相当于一个**按钮**,你要在哪一层下去,就按那一层按钮,就可以在这一层下去。

    switch语句的本质是什么?这么想你就对了!

    我们把使用switch语句的过程规律想象成坐电梯(大家都有坐电梯的经历),每个case语句后面的标号相当于一个按钮,你要在哪一层下去,就按那一层按钮,就可以在这一层下去。
    比如一共24层,你要去第几层,比如我要到第十层下去,那么你的第十层后面肯定要加个break语句,意义是到这一层就结束了,退出这个switch语句了,我要离开电梯了。
    如果说每一层都有人下去,那么每一层都有一个break语句。
    再如果说每一层都不下,我就从1层做到24层,我任性,皮,那你就要把break语句都要取消,不写break语句,一直执行到default语句后面的 } ,最后到顶层了,出电梯吧,退出switch语句。

    有点意思吧?看下面循序渐进的案例,帮你一步一步打通switch语句的任督二脉带你超神!
    先动手做实例演示,发现问题,再来补充知识,解决问题。注意,结合开头switch语句的本质来分析程序

    [接招看题029] 从键盘上输入一个百分制成绩score,按下列原则输出其等级:
    score≥90,等级为A;
    80≤score<90,等级为B;
    70≤score<80,等级为C;
    60≤score<70,等级为D;
    score<60,等级为E

    在这里插入图片描述
    思考题:如果去掉[接招看题029]程序中的所有break语句,且输入的成绩为85, 输出会如何?还记得电梯的比喻吗?
    先给答案,会把grade=A,grade=B,grade=C,grade=D,grade=E,The score is out of range!,在屏幕上原样输出。
    再看代码调试的结果:
    在这里插入图片描述

    原理是掌握使用的诀窍规律。也是你最头疼专业术语,但你还是要看一看的。想要成为一个武林高手,当然需要“降龙十八掌”一样的内功心法来助你修炼了。好,现在开始,随我一起修炼!
    1.switch语句的一般形式switch(表达式)
    { case 常量表达式1:语句组;break;
    case 常量表达式2:语句组;break;

    case 常量表达式n:语句组;break;
    [default:语句组;[break; ]]
    }

    流程图如下:
    在这里插入图片描述
    在这里插入图片描述
    2.说明:
    (1)执行过程当switch后面"表达式"的值,与某个case后面的"常量表达式"的值相同时,就执行该case后面的语句(组);
    当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。还记得电梯按钮吗?以下分析都是电梯的比喻。
    (2)如果没有任何一个case后面的"常量表达式"的值,与"表达式"的值匹配,则执行default 后面的语句(组)。然后 ,再执行switch语句的下一条。
    3.说明:
    (1)switch后面的"表达式",可以是int、char和枚举型中的一种。
    (2)每个case后面"常量表达式"的值,必须 各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。
    (3)case后面的常量
    表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以 必须加上break语句,以便结束switch语句。
    (4)各case及default子句的先后次序,不影响程序执行结果。
    (5)多个case子句,可共用同一语句(组)。
    例如,在[ 接招看题029]中的"case 10: "和"case 9: “共用语句"printf(“grade=A\n”); break;”,"case 5: "~"case 0: “共用语 句"printf(“grade=E\n”); break;”。
    (6)用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实 现。

    帮你省时的源代码:
    [接招看题029] 从键盘上输入一个百分制成绩score,按下列原则输出其等级:

    score≥90,等级为A;
    80≤score<90,等级为B;
    70≤score<80,等级为C;
    60≤score<70,等级为D;
    score<60,等级为E。
    
    main()
    {
        int  score, grade;
        printf("Input a score(0~100): ");
        scanf("%d", &score);
        grade = score/10;   /*将成绩整除10,转化成switch语句中的case标号*/
        switch (grade)
        {
        case  10:
        case    9: printf("grade=A\n"); break;    
        case    8: printf("grade=B\n"); break;
        case    7: printf("grade=C\n"); break;
        case    6: printf("grade=D\n"); break;
        case    5:
        case    4:
        case    3:
        case    2:
        case    1:
        case    0: printf("grade=E\n"); break;
        default: printf("The  score  is  out  of  range!\n");    
        }
    }      
    

    程序运行情况如下:

    Input a score(0~100): 85↙
    grade=B
    

    给各位少侠的结语:先恭喜你耐性的看完了这篇长文,此时的你离优秀又进了一步。在下也在修炼,所以更新博客会很慢。少侠努力修炼,祝少侠早日成为武林盟主。“江湖不见不散!”
    备注:如有不懂之处,观看我以前写的苏小红视屏,无需密码,即点即看。

    展开全文
  • C语言声明语句

    2019-09-28 17:59:47
    设计理念: C语言的一个设计理念就是声明变量和使用变量的形式应该是一致的 优点:声明变量和使用变量时的运算符优先级是相同的 缺点:运算符的优先级是C语言过度解析的部分之一 ... 说明...

    设计理念:

    C语言的一个设计理念就是声明变量和使用变量的形式应该是一致的

    优点:声明变量和使用变量时的运算符优先级是相同的

    缺点:运算符的优先级是C语言过度解析的部分之一

    术语:

    变量声明中使用到的符号的术语:(并不是所有的组合是合法的)

    数量 名称 举例
    0或更多 指针(pointer) *
    一个 说明符(declarator)

    identifier

    identifier[size]

    identifier(args)

    (declarator)

    0个或一个 初始化器(initializer) = initial_value
    至少一个类型限定符

    类型说明符

    存储类型    

    类型修饰符

    void char short

    extern static register

    const volatile

    0个或一个 更多的说明符 ,declarator
    一个 分号 ;

     

     

     

     

     

     

     

     

     

     

     

    关于struct和union:

    • 类型说明符是:struct {stuff...}
    • 声明形式:struct {stuff...} s;
    • tag:为了简写,可以在struct后面加上结构体tag:struct struct_tag {stuff...},这样就声明了struct_tag代表具体的类型集合{stuff...},之后的声明就可以使用struct struct_tag s;

    关于参数传递的两点说明:

    1. 某些书中会说"参数传递到调用函数的时候是从右到左压到栈中",这种说法是不对的。参数传递的时候会尽可能使用寄存器,所以一个整数和一个只含有一个整数的结构体的传递方法是完全不同的,一个整数可能通过寄存器传递,结构体会通过栈传递
    2. 通常一个数组是不能直接通过赋值来传递整个数组的,或者被一个函数返回,但是通过把数组作为结构体的唯一一个成员就可以实现

    虽然union具有和结构体类似的结构,但是它们有完全不同的存储方式

    • 结构体将每个成员存储到其前一个成员后面
    • union的所有成员都存储在相同的起始地址,所以不同的成员是相互覆盖的,同时只能有一个成员可以被存储

    union的一个明显的问题就是存储了一种类型但是用另一种类型取的类型安全问题,Ada语言主张在记录中存储说明字段来解决这个问题,但是C语言依赖于程序员能够记住存了什么而不采取任何措施

    union有两个用途:

    1. 节约空间
    2. 所有的成员有相同的存储空间大小的时候,就可以用不同的方式解析相同的二进制数据而不用显式的进行类型转换

    声明语句的解析:

    C语言可以有非常复杂的声明语句而让人无法轻易的搞清楚到底定义了什么东西

    有两种解析方式:

    方式一:优先级法则

    1. 声明的解析从名称开始,然后按照优先级规则继续执行
    2. 优先级从高到低:
      1. 将声明的各个部分组合在一起的括号
      2. 后缀操作符:指明一个函数的"()"和指明数组的"[]"
      3. 前缀操作符:指明是"指向..."的星号
    3. 如果"const"或"volatile"关键字和一个类型说明符相邻,就应用到这个类型说明符;否则,如果应用到左边紧邻的"*"

    方式二:状态机规则

    1. 从最左侧的标识符开始,"identifier是" "identifier is"
    2. 如果右侧是"[]"就获取,"一个...的数组" "array of"
    3. 如果右侧是"()"就获取,"参数为...返回值为...的函数" "function returning"
    4. 如果左侧是"("就获取整个括号中的内容,这个括号包含的是已经处理过的声明,回到步骤2
    5. 如果左侧是"const""volatile""*"就获取,持续读取左侧的符号直到不再是这三个之中的,之后返回步骤4
      1. "const":"只读的" "read only"
      2. "volatile":"volatile" "volatile"
      3. "*":"指向..." "pointer to"
    6. 余下的就是基本数据类型

    举例:char *(*c[10])(int **p);

    1. 按照优先级规则解析:
      1. c是一个...数组---c[10]
      2. c是一个指向...的指针的数组---*c[10]
      3. c是一个指向参数为...的返回值为...函数的指针的数组---(*c[10])()
      4. c是一个指向参数为整数的指针的指针的返回值为...函数的指针的数组---(*c[10])(int **p)
      5. c是一个指向参数为整数的指针的指针的返回值为指向...的指针函数的指针的数组---*(*c[10])(int **p)
      6. c是一个指向参数为整数的指针的指针的返回值为指向char的指针函数的指针的数组---char *(*c[10])(int **p)
    2. 按照状态机规则解析:
      1. c是...---c---1->2
      2. c是一个...的数组---c[10]---2->3
      3. c是一个指向...的指针的数组---*c[10]---3,4,5->4
      4. c是一个指向...的指针的数组---(*c[10])---4->2
      5. c是一个指向参数为int的指针的指针返回值为...的函数的指针的数组---(*c[10])(int **p)---2,3->4
      6. c是一个指向参数为int的指针的指针返回值为...的函数的指针的数组---(*c[10])(int **p)---4->5
      7. c是一个指向参数为int的指针的指针返回值为指向...的指针的函数的指针的数组---*(*c[10])(int **p)---5->6
      8. c是一个指向参数为int的指针的指针返回值为指向char的指针的函数的指针的数组---*(*c[10])(int **p)---5->6

    实现程序:

    状态机可以实现为自动翻译程序:

    https://github.com/biaoJM/translate-C-declaration-statement

    typedef和#define:

    1.宏定义的类型名和其他类型说明符一起执行定义,但是typedef只能使用它本身

    #define peach int  
    unsigned peach i; /* works fine */  
    typedef int banana;  
    unsigned banana i; /* Bzzzt! illegal */ 

    2.typedef的类型会实施到每个说明符,但是宏定义不会

    #define int_ptr int *  
    int_ptr chalk, cheese;
    // 结果为:
    int * chalk, cheese; 

    导致chalk是int的指针类型,而cheese是int类型

    typedef char * char_ptr;  
    char_ptr Bentley, Rolls_Royce;

    Bentley和Rolls_Royce都是char指针类型

    命名空间:

    C语言的命名空间

    1. 标签名,所有的标签名的命名空间
    2. tags,对于所有的结构体、枚举类和联合体的tag具有的命名空间
    3. 成员名称,对每个结构体、枚举类或联合体都有自己的成员命名空间
    4. 其他,其他名称的命名空间

    所以对声明:

    typedef struct baz {int baz;} baz;

    这样的定义是合法的:

    struct baz variable_1;  /*这里baz是定义的类型名*/
    baz variable_2; /*这里baz是tag*/

    对于这样的定义:

    struct foo {int foo;int foo2;} foo;

    第一个foo是这个结构体的tag,第二个foo是一个结构体变量
    sizeof(foo)的结果是变量foo的大小,所以如果声明时这样的:

    struct foo {int foo;int foo2;} *foo;

    sizeof(foo)返回的就是4而不是8,如果想要用tag获取结构体的大小:sizeof(struct foo)——tag只有和struct关键字一起才起作用
    而如果这样定义:

    typedef struct foo {int foo;int foo2;} foo;

    那么就不能再用foo作为变量名,因为此时foo不再是tag而和变量有相同的命名空间

    参考:

    《expert C programming:deep C secrets》

    Chapter 3. Unscrambling Declarations in C

    转载于:https://www.cnblogs.com/biaoJM/p/10186681.html

    展开全文
  • C语言 if语句

    千次阅读 2019-02-05 09:44:49
    [案例] 输入任意三个整数num1、num2、num3,求三个数.../*功能:说明if 语句的格式。*/ main() { int num1,num2,num3,max; printf("Please input three numbers:"); scanf("%d,%d,%d",&a...

    [案例] 输入任意三个整数num1、num2、num3,求三个数中的最大值。

    [案例] 输入任意三个整数num1、num2、num3,求三个数中的最大值。
    /*功能:说明if 语句的格式。*/
    main()
    {
        int num1,num2,num3,max;
        printf("Please input three numbers:");
        scanf("%d,%d,%d",&num1,&num2,&num3);
        if (num1>num2) 
            max=num1;
        else 
            max=num2;
        if (num3>max) 
            max=num3;
        printf("The three numbers are:%d,%d,%d\n",num1,num2,num3);
        printf("max=%d\n",max);
    }
                            
    程序运行情况如下:
    Please input three numbers:11,22,18↙
    The three numbers are:11,22,18
    max=22
    

    本案例中的第1个if语句,可优化为如下不带else子句的形式:
    max=num1;
    if(num2>max) max=num2;
    这种优化形式的基本思想是:
    首先取一个数预置为max(最大值),
    然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。这种方法对从3个或3个以上的数中找最大值的处理,非常有效。后面数组编程题也会用到这个方法。详情链接:

    1.if语句的一般格式
    if(表达式)
    {语句组1;}
    else
    {语句组2;} ]
    (1)if语句中的"表达式"必须用"(“和”)"括起来。
    (2)else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。
    (3)当if和else下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。作者建议大家加上花括号。

    2.if语句的执行过程
    (1)缺省else子句时 当"表达式"的值不等于0(即判定为"逻辑真")时,则执行语句组1,否则直接转向执行下一条。
    (2)指定else子句时当"表达式"的值不等于0(即判定为"逻辑真")时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。
    重点在下面:
    3.if语句的嵌套与嵌套匹配原则:
    if语句允许嵌套。所谓if语句的嵌套是指,在"语句组1"或(和)"语句组2"中,又包含有if语句的情况。 if语句嵌套时,else子句与if的匹配原则:与在它上面距它最近且尚未匹配的if配对。
    为明确匹配关系,避免匹配错误,强烈建议:将内嵌的if语句,一律用花括号括起来。

    展开全文
  • C语言中,switch语句是一种多分支选择语句,在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。 其使用一般形式如下: switch(表达式) { case 常量表达式1: 语句块1; break; case 常量表达式2: 语句块2;...
  • C语言switch语句

    2013-10-30 16:36:11
    switch语句: switch(表达式) ...说明: (1)switch后面括号内的表达式,其值可以使整形、字符型、枚举型数据 (2)应该在执行一个case分支后,使流程跳出switch,用break实现。 (3)最后一个分支(defa
  • 用一张粗略的图来表示 switch语句的运行结构: 代码格式为: switch(表达式) { case 常量1:语句序列1;break;...程序说明: case 、 switch 表达式必须是 int 、 char 型数据 default 在一定情...
  • c语言 常用语句

    2013-01-07 15:52:19
    fabs  原型:在TC中原型是extern float fabs(float x);,在VC6.0中原型是double fabs( double x );... 说明:计算|x|, 当x不为负时返回x,否则返回-x  类似函数:abs fabs针对浮点数,abs针对整
  • 大家能帮忙解答一下这个代码的问题吗? ![图片说明](https://img-ask.csdn.net/upload/202011/04/1604488981_365473.png)
  • c语言switch语句的问题

    2016-06-10 08:03:23
    #include struct vote { char name[20]; int num; }vote[3]; int main() { int i,c; printf("请输入三位候选人的名字\n");...[图片说明](https://img-ask.csdn.net/upload/201606/10/1465545800_649599.png)
  • [图片说明](https://img-ask.csdn.net/upload/201909/22/1569157077_945479.png) 输入一个数,回车后,这个样子 ![图片说明](https://img-ask.csdn.net/upload/201909/22/1569157099_996926.png) 求解
  • 就是下面的代码有错误 不知道用什么语句 求指教 谢谢了 **_if(year%4!=0 && year%100==0 || year%400!=0) { printf("该年份等于365天\n"); }**_ 效果如下 ![图片说明]...
  • c语言 strcat语句 gets_s

    2015-12-16 13:25:28
    [图片说明](https://img-ask.csdn.net/upload/201512/16/1450272006_185622.png)图片说明](https://img-ask.csdn.net/upload/201512/16/1450271989_53586.png) 请问是哪里出错了,而且明显两个字符连接后是没有空格...
  • [图片说明](https://img-ask.csdn.net/upload/201909/22/1569149801_496300.png) 上图是我写的程序,我定义了字符串C,希望能完成自己输入一个数的结果,可是一运行,系统完成编译后自动退出了,不给我输入一个...
  • C语言中的switch/case语句(分支语句)虽然使得程序结构简单,程序执行效率也较多条if语句(条件语句)高,但由于case 中的表达式只能是常量而大大限制了其用途。针对switch/case语句的缺点,设计了一种新的、很结构...
  • ![图片说明]...我使用了循环语句,但是结果出来很多数字 我不明白后面那些如何出来的,,,按说if(n==a)应该只有一种情况 a是输入的 然后n一直增加呀,,,
  • C语言入门 if语句练习if语句说明 以及 本文用到的逻辑运算符两个数字比大小成绩划分判断是否是闰年求象限懒人闹钟 练习题代码只是博主的个人思路,解题方法有很多。 代码最大的魅力就是,结果是一样但是内部构造是...
  • C语言-typedef语句

    2020-02-04 11:26:35
    C语言中提供的typedef语句,可以为系统已定义的简单类型(int 、char、float等)另起一个名字,也可以为自己定义的结构体、共用体、枚举等数据类型另起一个名字。 typedef语句定义格式 typedef 类型名 新类型名; ...
  • c语言学习之语句

    2016-01-06 19:51:19
    c语言中的语句和我们平时说的语句类似,都是由一个个变量,常量,关键字,保留字等等组成的,可以被机器识别的一串代码,在c语言中的语句有这几类 空语句:单独一个分号就是一个空语句,通常在...变量定义和说明语句:; 块(复合
  • 问题:c语言,看看我写的哪有问题? 输入字符串,计算大写字母,小写字母,数字的个数(用for循环) 回答: 这个循环不能写n的(超过99就下标溢出了) 且你a[100]只用gets(a)得到没有100个数据的,真实数据后面...
  • 12个C语言语句

    2009-07-18 13:01:00
    下面的12个C语言语句是我从实际的应用系统中摘录和简化来的。这些语句都被我列入丑陋代码的类别中。对此,我给出了相应的改善程序和说明。1.if ( strlen(s) == 0 ) if ( strlen(s) )if ( strcmp(s, “”) == 0 )...
  • 语句C语言中由一个;隔开的就是一条语句。 例如: 2.分支语句(选择结构) 2.1if语句 2.1.1语法结构 (1) if (表达式) { 代码块; } (2) if (表达式) { 代码块1;//表达式为真 } else { 代码块2;//表达式为假 ...
  • } /* 输出结果 第二条表达式 */ 说明if语句的作用范围只有紧跟if的第一条表达式 您可能感兴趣的文章:C语言压缩文件和用MD5算法校验文件完整性的实例教程使用C语言实现CRC校验的方法c语言求出给定范围内的所有质数...
  • C语言for循环语句用法

    千次阅读 多人点赞 2019-05-15 16:58:18
    说明: (1)for是关键字。 (2)for之后的圆括号内一共有3个表达式,以分号隔开。一般情况下,表达式1的作用是赋初值;表达式2的作用是控制循环,即循环条件;表达式3的作用是修改循环变量的值,一般是赋值。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,869
精华内容 747
关键字:

c语言说明语句

c语言 订阅