精华内容
下载资源
问答
  • C语言中不能使用引用传参

    千次阅读 2011-10-27 10:30:15
    如果需要使用引用传参,必须cpp中使用在c语言中使用时编译通不过。
    如果需要使用引用传参,必须在cpp中使用,在c语言中使用时编译通不过。
    展开全文
  • c语言中static关键字用法详解

    万次阅读 多人点赞 2018-04-05 18:18:14
    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的...程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,任何一个函数内部定义的变量(加static修饰...

    概述

    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。

    但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。

    最后一节加入了c++面向对象中static的使用特性,当作拓展阅读。


    在程序中使用static

    变量

    1. 局部变量

    普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。

    普通局部变量存储于进程栈空间,使用完毕会立即释放。

    静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

    变量在全局数据区分配内存空间;编译器自动对其初始化
    其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束

    小程序体会一下静态局部变量的威力:

    #include <stdio.h>
    
    void fn(void)
    {
        int n = 10;
    
        printf("n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    void fn_static(void)
    {
        static int n = 10;
    
        printf("static n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    int main(void)
    {
        fn();
        printf("--------------------\n");
        fn_static();
        printf("--------------------\n");
        fn();
        printf("--------------------\n");
        fn_static();
    
        return 0;
    }
    

    运行结果如下:

    -> % ./a.out 
    n=10
    n++=11
    --------------------
    static n=10
    n++=11
    --------------------
    n=10
    n++=11
    --------------------
    static n=11
    n++=12
    

    可见,静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。

    2. 全局变量

    全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

    普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

    静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

    在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

    函数

    函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

    • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    • 不同的文件可以使用相同名字的静态函数,互不影响

    非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

    下面两个文件的例子说明使用static声明的函数不能被另一个文件引用:

    /* file1.c */
    #include <stdio.h>
    
    static void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    int main(void)
    {
        fun();
        fun1();
    
        return 0;
    }
    
    /* file2.c */
    #include <stdio.h>
    
    static void fun1(void)
    {
        printf("hello from static fun1.\n");
    }
    

    使用 gcc file1.c file2.c编译时,错误报告如下:

    /tmp/cc2VMzGR.o:在函数‘main’中:
    static_fun.c:(.text+0x20):对‘fun1’未定义的引用
    collect2: error: ld returned 1 exit status
    

    修改文件,不使用static修饰符,可在另一文件中引用该函数:

    /* file1.c */
    #include <stdio.h>
    
    void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    /* file2.c */
    int main(void)
    {
        fun();
    
        return 0;
    }
    

    同样使用 gcc file1.c file2.c编译,编译通过,运行结果如下:

    -> % ./a.out 
    hello from fun.
    

    面向对象

    静态数据成员

    在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:

    • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
    • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
    • 由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
    • 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
    • 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
    • 类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

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

    • 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性
    • 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
    静态成员函数

    与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下:

    • 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
    • 出现在类体外的函数定义不能指定关键字static
    • 非静态成员函数可以任意地访问静态成员函数和静态数据成员

    总结

    static是一个很有用的关键字,使用得当可以使程序锦上添花。当然,有的公司编码规范明确规定只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格。

    无论如何,要在实际编码时注意自己的编码习惯,尽量体现出语言本身的优雅和编码者的编码素质。

    展开全文
  • 关于汇编需要那也基础,知道具体汇编语言的用途,汇编语言c语言之间有哪些关联了
  • 前言scanf()是C语言的格式输入函数,和printf函数一样被声明stdio.h头文件,它的基本使用很简单:1 int a;2 scanf("%d",&a);//程序执行到这里时,就等待用户输入;它接收的是变量的地址//所以一般情况下除了...

    前言

    scanf()是C语言的格式输入函数,和printf函数一样被声明在stdio.h头文件中,它的基本使用很简单:

    1 int a;

    2 scanf("%d",&a);//程序执行到这里时,就等待用户输入;它接收的是变量的地址

    //所以一般情况下除了指针型变量和数组名要给变量加上取地址符&

    下面主要介绍了C语言中scanf的用法和注意事项,下面来一起看看详细的介绍吧

    scanf概念

    scanf是格式输入函数,功能是在屏幕上输入指定的信息。简单的来说和printf相似却不相同。

    scanf调用格式: scanf("",);

    如:

    #include

    int main()

    {

    int a,b,c;

    printf(“input three data:\n”);//使用 scanf 之前先用 printf 提示输入。

    scanf("%d%d%d",&a,&b,&c); // scanf 的“输入参数”中,前面的取地址符&记住

    printf("%d,%d,%d/n",a,b,c);

    return 0;

    }

    运行时按如下方式输入三个值:

    3□4□5↙(输入a,b,c的值)

    3,4,5 (printf输出的a,b,c的值)

    (1) &a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。

    (2) "%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。

    以下是合法输入方式:

    ① 3□□4□□□□5↙

    ② 3↙

    4□5↙

    ③ 3(tab键)4↙

    5↙

    我们常用到的字符串有:

    %c 读入一个字符。

    %d 读入十进制整数。

    %f 用来输出实数,以小数形式输出。

    %lf 用来输出实数,以更长的小数形式输出。

    分享下学习中明白的注意点:

    1 当定义一个字符变量时,在键盘上输入一个scanf会吸收回车和空格字符,为了进行代码的可行性需在函数结束前加函数getchar()进行吸收。例如:

    c5108fa0f539155efde0b73c8f80710a.png

    定义一个字符z,是scanf是从键盘上获取一个值。因为我们定义的是一个字符,所以将键盘上所有获得的字符赋值给z,而空格和回车也是字符,会影响字符赋值给z,所以要在末尾加个getchar()函数进行吸收。

    没加getchar():

    220033894dcc740a9faf9b19af09864a.png

    程序第二次进行运算时回车成了运算符了。

    正确结果是:

    cd6733a5dea340423910ef58546d1385.png

    2 scanf函数中的“格式控制”后面应当是变量地址,而不是变量名。例如,若a和b为int型变量,如果写成scanf("%f%f%f",a,b,c)是错误的。

    scanf 的使用小结:

    1 在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记。

    2 scanf 中双引号内,除了“输入控制符”外什么都不要写。

    3 “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。

    4 “输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类 型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理。

    5 使用 scanf 之前先用 printf 提示输入。

    总结

    到此这篇关于c语言中scanf的基本用法的文章就介绍到这了,更多相关c语言scanf用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • 在C语言中嵌入汇编语言方法

    千次阅读 2014-08-25 13:57:15
    两种方法在c语言中嵌入汇编:   (1) __asm(" 字符串序列"); 例如: __asm(" MOVN A,#1");   (2) #pragram asm  汇编语句  #pragram endasm 例如:  #pragram asm  MOVN A,#1  MOVW _temp,A
    两种方法在c语言中嵌入汇编:
    
     
    (1) __asm(" 字符串序列"); 例如:
    __asm(" MOVN A,#1");
     
    (2) #pragram asm
           汇编语句
         #pragram endasm
    例如:
         #pragram asm
           MOVN A,#1
           MOVW _temp,A
    展开全文
  • 汇编语言C语言的混合使用

    万次阅读 2006-02-28 21:29:00
    在C语言中如何使用汇编语言呢?这个问题不同的编译器,具体实现方法是不同的。不过实现大方上也不过就是有两种,而且各种编译器的实现方法也是大同小异。一种是在C语言中嵌入汇编语言代码,另一种是让C语言从...
  • 关于C语言等高级语言能不能直接控制硬件的问题,我认为C语言
  • c语言中的null_如何C中使用NULL

    千次阅读 2020-08-31 01:32:51
    c语言中的nullSeveral programming languages make use of the concept of null. 几种编程语言使用null的概念。 Go has nil, JavaScript has null, Python has None, and so on. Go具有nil ,JavaScript具有...
  • 编程是和机器沟通,因此要用机器的语言而不是人类的语言。最早的程序就是0和1的数字,不是中文也不是英文。以前的程序员,每天写程序就是一条长长的纸带上打孔表示0和1。后来发现0和1的二进制太麻烦了,就把0和1...
  • 汇编语言C语言混合编程在C语言中通过全局变量来引用汇编的数据定义非常普遍,然而却存在同名不同义的陷阱。1 测试代码汇编语言中的定义整数变量studentID,并赋初值,如下: .global studentID .data ...
  • 我们从小学习数学时就知道“ = ”是 “等于”的意思,可是在C语言中,“ = ”就不是等于的意思了。 我写了如下的C语言代码: 上述C语言代码,整型变量 a 的初始值是0。两个 if 语句判定条件,我分别用...
  • 好久没用matlab编写程序,上周亲导师面前,愣生生是2小时没编出一选择函数的程序。羞愧至极,愤而写之。...1、if用法(matlab中使用的是elseif,注意与c语言写法和句式的区别) 1)matlab中 ① 基本格...
  • C语言中nan的使用

    千次阅读 2016-07-19 21:09:13
    含义:表示 not a number 产生:对浮点数产生了未定义的操作 1.对负数开方,对负数求对数,0.0/0.0,0.0*inf、inf/inf、inf-inf这些操作都会得到nan。...GNU使用宏:float NAN对浮点数赋值;
  • Linux内核中不能使用C语言的标准库

    千次阅读 2007-05-24 18:11:00
    Linux内核中不能使用C语言的标准库。 我们讲道理: 操作系统内核提供一个应用程序接口(API)给应用程序调用,有 一些功能比较常用,于是把这些功能做成了一个函数库,叫C语言的标准库。于是C语言的标准库是依靠操作...
  • 【转】C语言中 -> 是什么意思?

    万次阅读 多人点赞 2017-05-04 20:52:20
    换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体的数据,就要用到“-&gt;”. 举个例子: struct Data { int a,b,c; }; /*定义结构体*/ struct ...
  • 编译《自制编程语言 基于c语言》 郑钢 书代码
  • C语言中switch case使用

    万次阅读 2019-05-06 17:00:16
    1.C,case和default只是作为一个入口使用,default最后判定,意思是当所有case:条件均满足时,执行default,前提是没有使用break(中断)。 2.例如输入b=1时,执行case1,case2,假如defaultcase2:下...
  • 在C语言中如何计算根号

    千次阅读 多人点赞 2021-02-01 15:18:00
    在C语言中如何计算根号 int main() { double x = 9, y; y = sqrt(x); //计算x开根号 }
  • C语言中break与continue使用

    万次阅读 多人点赞 2017-05-05 14:00:19
    C语言中break与continue使用场景
  • 在C语言中使用wchar_t等宽字符显示中文测试 长期的C语言编程中,我从未意识到使用中文带来的不便,因为只要调用默认的printf语句即可,如: #include int main(int argc, char *argv[]) { fprintf(stdout, ...
  • scanf在c语言中的作用是什么?

    千次阅读 2021-08-19 00:10:04
    scanf()函数scanf()是C语言中的一个输入函数。与printf函数一样,都被声明头文件stdio.h里,因此在使用scanf函数时要加上#include。(有一些实现,p...
  • 分别用机器语言、汇编语言C语言(高级语言)来写一个计算1+1的程序 1) 机器语言:简直是天书!!! 10111000 00000001 00000000 00000101 00000001 00000000 2) 汇编语言:可读性稍微好一点,但是麻烦 ...
  • 直击PHP的异常和错误处理_后端开发程序运行出现符合预期的情况, php 脚本自身的问题是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行,需要我们及时解决。C语言中double是什么意思?...
  • go语言C语言的对比

    万次阅读 2017-08-19 13:42:54
    下面的go语言C语言的对比, 看过就知道go语言是多么简洁! http://hyperpolyglot.org/c
  • c语言中goto使用注意事项

    千次阅读 2017-07-08 21:21:56
    在c语言中可以用goto来处理错误,但是要特别注意的是goto会顺序执行下去,所以goto如果没有分支或retun的话可能会出错#include //冒泡排序,把数组的元素从大到小或从小到大列出int main(void) { int arr[10]=...
  • 漫画:为什么C语言永不过时?

    万次阅读 多人点赞 2020-10-09 08:51:00
    更多精彩技术漫画,尽码农翻身后记:这篇漫画主要是科普一下编程语言的发展历史和适用范围。C语言/C++一直是系统级编程的不二之选,操作系统,编译器,网络,数据库,高性能服务器端软件等领...
  • C语言中字符型(char)的简单使用

    万次阅读 多人点赞 2020-11-17 21:12:04
    C语言中字符型(char)的简单使用 刚接触C语言不久,这记录下自己的一些学习心得。今天主要是敲代码时遇到了一个小问题,如图: 应该是个比较简单的编程题。我的想法,应该使用循环逐个读入由A至Z的每个...
  • ARM中C语言和汇编语言的混合编程

    千次阅读 2018-01-25 21:38:48
    在C语言中内嵌汇编注意事项: 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令 在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突 R12和R13可能被编译器用来存放中间编译结果,计算...
  • 在C语言程序中使用cURL库(libcurl)

    万次阅读 2011-11-23 14:52:41
    cURL本身就是用C语言写的,当然可以在C语言中使用。但是理论和实践还是有一定距离的,以前研究了好几天才研究出怎样正确的使用libcurl的C语言API,曾经也分享过,不过重建博客的时候没有备份数据库。再写一次吧。 ...
  • C语言中access函数的使用

    万次阅读 2017-08-08 22:08:35
    GNU的C语言库其实功能还是很强大的,不过这方面我了解学习的确实是多。最近又接触到了一个文件访问操作的函数,之前觉得只有高级语言才能够实现,没想到借用glibc用C语言实现起来也蛮简单的。这个函数的声明io.h...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 486,281
精华内容 194,512
关键字:

哪些语言在c语言中不能使用

c语言 订阅