精华内容
下载资源
问答
  • ![图片说明]... 就是简单的输出一个数组10个数中最小和次小值的程序 每次输完十个数就跳出lldb 也不执行printf 之前也遇到过好几次类似的情况 想知道为什么 菜鸟在这谢谢大家了
  • 单片机为什么还在用C语言编程?答案是:C语言是最适合单片机编程的高级语言。这个问题的意思应该是:现在有很多很好用的高级语言,如java,python,VC等等,为什么这些语言不能用来编写单片机程序呢?那么这个问题的...
  • 不知道大家有没有想过一个问题:C语言编译器为什么能够用C语言编写? 今天小编就带大家一探究竟! 所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,...

    不知道大家有没有想过一个问题:C语言编译器为什么能够用C语言编写?

    今天小编就带大家一探究竟!

     

    所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件。

    其本质在于对文件的读入,分析,及处理。这些操作,C语言都是可以实现的。

    所以用C语言来做C语言的编译器是完全可行的。

    但是,历史上的第一个C语言编译器,肯定不是C语言写的,因为在没有编译器时,无法把C语言转换成可执行文件。只要有了第一版其它语言的编译器,就可以用C语言写编译器了。

     

    那么世界上第一个C语言编译器又是怎么编写的呢?

    还是让我们回顾一下C语言历史:

    1970年Tomphson和Ritchie在BCPL(一种解释型语言)的基础上开发了B语言,

    1973年又在B语言的基础上成功开发出了现在的C语言。

    在C语言被用作系统编程语言之前,Tomphson已经使用B语言编写过操作系统。可见在C语言实现以前,B语言已经可以投使用了。

    因此第一个C语言编译器的原型完全可能是用B语言或者混合B语言与PDP汇编语言编写的。

    事实上,B语言的执行效率比较低,但是如果全部用汇编语言来编写,不仅工作量巨大,而且汇编语言的可读性极差,很容易就会出错!

    上一张图大家感受一下这巨大的差别!!!

     

    为了克服这个困难,早期的C语言编译器就采取了一个取巧的办法:先用汇编语言编写一个C语言的一个子集的编译器,再通过这个子集去递推完成完整的C语言编译器。

    大致过程如下:

     

    先创造一个只有C语言最基本功能的子集,记作C0语言,C0语言已经足够简单了,可以直接用汇编语言编写出C0的编译器。

    依靠C0已有的功能,设计比C0复杂,但仍然不完整的C语言的又一个子集C1语言,其中C0属于C1,C1属于C,用C0开发出C1语言的编译器。

    在C1的基础上设计C语言的又一个子集C2语言,C2语言比C1复杂,但是仍然不是完整的C语言,开发出C2语言的编译器……如此直到CN,CN已经足够强大了,这时候就足够开发出完整的C语言编译器的实现了。

    至于这里的N是多少,这取决于你的目标语言(这里是C语言)的复杂程度和程序员的编程能力。

    那么这种大胆的子集简化的方法,又有什么理论依据呢?

    先介绍一个概念,“自编译”Self-Compile。

    对于某些具有明显自举(不知道哪个鬼才起的名字)性质的强类型编程语言

    可以借助它们的一个有限小子集

    通过有限次数的递推来实现对它们自身的表述

    (所谓强类型就是程序中的每个变量必须声明类型后才能使用,比如C语言,相反有些脚本语言则根本没有类型这一说法,比如python。)

    满足自编译这样的语言有C、Pascal、Ada等等,至于为什么可以自编译,可以参见清华大学出版社的《编译原理》,书中实现了一个Pascal的子集的编译器。

    总之,已经有计算机科学家证明了,C语言理论上是可以通过上面的方法实现完整的编译器的。

     

     

    最后,如果你也想成为程序员,想要快速掌握编程,这里为你分享一个学习企鹅圈子!

    里面有资深专业软件开发工程师,在线解答你的所有疑惑~编程语言入门“so easy”

    编程学习书籍:

     

    编程学习视频:

     

    展开全文
  • printf("执行语句%s",o); strcpy(com[j-1].num,com[j].num); } for(i=0;i;i++) com[i].no=i+1; printf("编号\t姓名\t得分\n"); for(i=0;i;i++) printf("%s\t%s\t%.2f\n",com[i].num,com[i].name...
  • } //p与p->next都指针变量,;不能忘记// if(j||j>i) return ERROR ; //一次执行完的判断 c=(Node*)malloc(sizeof(Node)); c->a=e; c->next=p->next; //空指针域的继承与修改 p->next=c; return OK;...
  • 通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。可以说指针是C语言中重要的存在,必须掌握。什么是指针(Point)?指针是一个变量,其值另一个变量的地址,即,...

    前言

    不得不说C语言中的指针既有趣又强大。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。可以说指针是C语言中重要的存在,必须掌握。

    7d3ddd1b0139eb95b2cca32454906f73.png

    什么是指针(Point)?

    指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

    数据类型 *变量名称;

    举几个实际例子:

    int* a; //有符号 整型 指针

    unsigned int* b; //无符号 整型 指针

    char* c; //字符串指针

    struct tagItem* d; //结构体指针

    void* e; //万能、或任意指针

    通过上述例子,我们得知,不同数据类型有不同类型的指针。它们的区别在于数据类型的不同,但定义模式是一致的。

    456079be0c40eea77deece71dc152a94.png

    怎么使用指针呢?

    想要用好指针,我们必须深刻认识上述讲到的指针的功能。接下来,我们还是从实际例子来进一步描述和使用指针。

    int main(){   int a = 100;   int* pA = &a;      //将pA指向变量a   int b[3] = { 0, 1, 2 };   int* pB = b;        //将pB指向变量b,其中b是整型数组    *pA = 1000;            //为指针指向的地址赋值1000,即变量a 变为了 1000  *pB = 100;              //为数组b第一个元素赋值 100  *(pB + 1) = 101;     //为数组b第二个元素赋值 101    return 0;}

    更详细点,指针的用途基本可分为以下几种:

    1. 算术运算,比如:p++,p--,亦或p+=5,通常用于字符串指针、亦或数组指针。
    2. 作为结构体的成员变量使用。通常用于指向一个内存块、或共享数值的变量。
    3. 作为函数参数、或返回值使用。目的为了实现按地址、引用传递,而非按值传递。通常用于对结构体、或数组、或函数的指针,传递。
    51fc018770cc2314248dc87bf9bf9b42.png

    指针中的重点之一,空指针,NULL

    NULL是什么?它代表空,没有指向地址,通常用作初始化指针,告诉编译器指针暂时空闲。可为什么说NULL很重要?

    因为指针本质是指向一块内存区域,而我们通常是无法直接判断指向的内容是否合法,这就造成了指针使用困难。而如果通过判断指针是否为NULL(0),来判断是否合法,那么这一难题就迎刃而解。

    if (p){ //指针指向有效 }

    if (!p){ //指针指向无效 }

    通过上述例子,我们可以明确知道判断方法。但要实现判断,还有个重要的前提条件:指针不再使用的时候,务必置为NULL(0)。

    int* a = 0; //定义指针,并初始化为空。

    int b;

    a = &b; //设置指针

    if (a){

    *a = 100; //为变量b赋值

    a = 0; //释放指针

    }

    e076a115beb5251e50bd8968af7e0157.png

    总结

    篇幅有限,指针博大精深,更多的关于指针的使用,需各位软件工程师,不断地练习,理解。

    更多精彩,请关注“技术同胞”

    #C语言# #指针# #电脑编程# #编程语言#

    展开全文
  • 计算机无法直接将C语言的代码运行,他们并不懂得什么C语言,实际上,计算机只处理他们的机器语言,所以我们必须自己找一个翻译,这个翻译可分为2种: 1.编译器 编译器是“文章的译者”,它在我们完成创作后将其...
  • C语言相关题目

    千次阅读 2012-09-23 01:53:09
    1C++中有了malloc/free,为什么还需要new/delete? 主要是除了控制内存还能执行其他编译器相关操作。 malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 ...

    1C++中有了malloc/free,为什么还需要new/delete?

    主要是除了控制内存还能执行其他编译器相关操作。

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

    对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执析造函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析造函数的任务强加于malloc/free。

    因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。new/delete不是库函数,而是运算符。

    2 有两个变量a和b,不用“if”,“?:”,“switch"或其他判断语句,找出两数中间的最大值

    int max = ((a+b)+abs(a-b) ) / 2;

    3.return (x&y)+((x^y)>>1))返回值的结果是什么?

    int f( int x, int y)

    {

        return (x&y)+((x^y)>>1);

    }

    x&y是取相同的位与,这个结果是x和y相同位的一半,x^y是取x和y的不同位,右移相当于除2,这个函数的功能是取两个数的平均值

     4.空指针和迷途指针(悬浮指针)的区别是什么?

    当delete一个指针的时候,实际上是让编译器释放内存,但指针本身依然存在。这时它就是一个迷途指针

    当使用以下语句时,可以把迷途指针改为空指针:

           Myptr = 0;

    通常,如果在删除一个指针后又把它删除了一次,程序会变得非常不稳定,任何情况都有可能发生,但是如果像只是删除一个空指针,则什么事情都不会发生,这样做非常安全。

    使用迷途指针或空指针(如Myptr=0)是非法的,而且有可能造成程序崩溃。如果指针是空指针,尽管同样是崩溃,但它同迷途指针造成的崩溃相比是一种可预料的崩溃。这样调试起来方便很多。

    5.在C++程序中调用被C编译后的函数,为什么要加extern "C"?

    C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库的名字与C语言的不同。假设某个函数的原型为void foo(int x, int y)。该函数被C编译器编译后与库中的名字为_foo,而C++编译器刚会产生像_foo_int_int之后类的名字。

     

     

    展开全文
  • 高精度乘法 C语言

    2021-01-04 16:05:28
    为什么需要高精度乘法 原因: 首先我们看一看C语言用到的表示整数的数据类型 1.int 2.long int 3.long long int 即使是最大的long long int 类型能表达的位数依然有限 所以需要该表处理更大数据的策略 如何改进...

    高精度乘法

    为什么需要高精度乘法

    原因:
    首先我们看一看C语言用到的表示整数的数据类型
    1.int
    2.long int
    3.long long int
    即使是最大的long long int 类型能表达的位数依然有限(可以去百度具体就不写了)
    所以需要一个处理更大数据的策略

    如何改进处理大数据的乘法

    既然我们的计算机无法处理这么大的数字,那么我们可以试着转换一下思想,做一个模拟乘法,他不一定是计算机在完成乘法而是给出一个算法,计算机程序执行完以后结果就是乘法得出的结果。而同时计算机不用处理这么大的数据。最容易想到的是把数字当作字符处理。下main给出了两种方法

    两种思路

    a.

    示意图:在这里插入图片描述
    代码:

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int a[1000],b[1000],c[1000];//准备好三个数组
        int lena,lenb,lenc,i,j;
        char s1[]="986";
        char s2[]="123";
        lena=strlen(s1);
        lenb=strlen(s2);
        for(i=0;i<1000;i++)//将c数组赋予初值,后面会用上
            c[i]=0;
        for(i=1;i<=lena;i++)//986存入a[]
            a[i]=s1[lena-i]-'0';
        for(i=1;i<=lenb;i++)//123存入b[]
            b[i]=s2[lenb-i]-'0';
        for(i=1;i<=lenb;i++)//遍历被乘数123
            for(j=1;j<=lena;j++)//遍历乘数986
                c[i+j-1]+=a[j]*b[i];//c数组的
        lenc=lena+lenb-1;
        for(i=1;i<=lenc;i++)
        {
            c[i+1]+=c[i]/10;//求进位并把进位加入高位
            c[i]%=10;//保存余数
    
        }
        lenc++;//将数组长度加1用来保留前面产生的进位
        while(c[lenc]==0&&lenc>1)
            lenc--;//删去前面多余的0
        for(i=lenc;i>=1;i--)//遍历输出
            printf("%d",c[i]);
        printf("\n");
        return 0;
    }
    
    

    流程:
    在这里插入图片描述

    b.

    示意图;
    在这里插入图片描述
    代码:
    (与上一个代码基本一样除了标注部分)

    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int a[1000],b[1000],c[1000];
    
        int lena,lenb,lenc,i,j;
        char s1[]="986";
        char s2[]="123";
        lena=strlen(s1);
        lenb=strlen(s2);
        for(i=0;i<1000;i++)
            c[i]=0;
        for(i=1;i<=lena;i++)
            a[i]=s1[lena-i]-'0';
        for(i=1;i<=lenb;i++)
            b[i]=s2[lenb-i]-'0';
      
    //************************************************
    (和上一个代码不一样部分)
      for(i=1;i<=lenb;i++)
            for(j=1;j<=lena;j++)
            {
                c[i+j-1]+=a[j]*b[i];
                c[i+j]+=c[i+j-1]/10;
                c[i+j-1]%=10;
    
            }
        lenc=lena+lenb;
    //************************************************
        for(i=1;i<=lenc;i++)
        {
            c[i+1]+=c[i]/10;
            c[i]%=10;
    
        }
        lenc++;
        while(c[lenc]==0&&lenc>1)
            lenc--;
        for(i=lenc;i>=1;i--)
            printf("%d",c[i]);
        printf("\n");
        return 0;
    }
    
    

    流程图:
    在这里插入图片描述

    展开全文
  • 1. 什么是流程控制 概念:程序代码执行的顺序 流程控制的分类 ... 只控制A的执行或不执行无法控制语句B一定会执行 2. if(表达式) { 语句A; 语句B; } if都控制 if…else…用法 是
  • 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。 (1)void *malloc...
  • C语言动态数组

    2012-02-10 23:20:02
    词目释义  动态数组,是相对于静态数组而言。静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新...为什么要使用动态数组?  在实际的编程中,往往
  • c语言学习day08

    2019-06-30 19:21:15
    有了栈,为什么还需要堆?栈上的数据在函数结束后就被释放掉了,无法传递到函数的外部,如局部数组。在需要使用申请空间的返回地址时,就要使用堆了 堆空间的管理方法有空闲链表法,位图法,对象池法等等,不同的...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,我们还是建议采用汇编语言比较好。 而C语言是一...
  • 大学理工科的学生都要学习C语言,那么为什么要学习这个比自己岁数都大的编程语言呢? 网上曾经流传过一句话:当你精通C语言的时候,你会发现C语言除了生孩子,别的没有什么是C语言办不到的。我们来看一下其他语言...
  • 为什么是合法的C语言表达式呢? 数组的指针 6.12 既然数组引用会退化为指针,如果array是数组,那么array和&array又有什么区别呢? 6.13 如何声明一个数组的指针? 动态数组分配 6.14 如何在运行时设定数组的...
  • o 3.11 为什么 sizeof 返回的值大于结构的期望值, 是不是尾部有填充? o 3.12 如何确定域在结构中的字节偏移? o 3.13 怎样在运行时用名字访问结构中的域? o 3.14 程序运行正确, 但退出时却 ``core dump''了,...
  • C语言基本点初探

    2015-03-27 21:29:00
    此语句错误,为什么呢,对于i++来说,i是一个变量,是把i加1然后赋值给i,然而10不是一个变量所以无法执行加加的语法; 2,运算符的优先级: 赋值运算符<逻辑运算符<关系运算符<算数运算符; 转载于:...
  • c语言动态内存分配

    2015-10-28 10:50:00
    一. 静态数组与动态数组 静态数组比较常见,数组长度预先定义好,在整个程序中,一旦给定大小后就无法再改变长度,静态数组自己自动负责释放占用的内存。 动态数组长度可以随程序的需要而... 为什么要使用动态数组?...
  • 94_学C语言为什么无法做出像样东西 和 各门课程之间关系 93 _ continue的用法 92 _ break的用法【重点】 91 _ switch琐碎非重点知识介绍 90 _ switch的用法简介 89 _ 一元二次方程 用do...while 实现 88 _ do......
  • 什么是流程控制 程序代码执行的顺序 流程控制的分类 顺序 选择 定义:某些代码可能执行,也可能不执行,有选择的执行某些代码 ...解释:if默认只能控制语句A的执行或不执行无法控制语句B的执行与不执行 if...
  • (克隆成功),第K+1天开始执行任务; 三、每个士兵自成功克隆后,只有前A天取得的材料才能作为有效的克隆材料。 每个士兵每天只能对要塞造成5点的伤害,虽然数量越来越多,但攻破之日 还是遥遥无期啊。逐青给他...
  • 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 1.26 main的正确定义是什么?void ...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确...
  • 1.2 为什么不精确定义标准类型的大小? 2 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都...
  • 变量为什么初始化? 不初始化变量将是垃圾值 详细说明系统如何执行:int = 5;? 1>.VC++6.0请求系统为变量i分配内存空间; 2>.操作系统寻求空闲空间 并分配给i 3>.将数字5与变量i关联起来,操作变量...
  • 为什么是合法的C语言表达式呢?  数组的指针  6.12 既然数组引用会退化为指针,如果array是数组,那么array和&array;又有什么区别呢?  6.13 如何声明一个数组的指针?  动态数组分配  6.14 如何在运行时...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 145
精华内容 58
关键字:

为什么c语言无法执行

c语言 订阅