精华内容
下载资源
问答
  • 这个问题产生的原因是程序员编写C语言代码不规范造成的,这也是很多初学者容易犯的错——只关注核心功能,而不关注细节。问题是这样的问题小明在源文件 f1.c 里定义了一个布尔函数,相关的C语言代码是下面这样的:#...

    昨天浏览外文论坛帖子,发现一个有趣的问题。这个问题产生的原因是程序员编写C语言代码不规范造成的,这也是很多初学者容易犯的错——只关注核心功能,而不关注细节。

    739588af80d506096fad453cd15e4470.png问题是这样的

    问题

    小明在源文件 f1.c 里定义了一个布尔函数,相关的C语言代码是下面这样的:

    #include

    bool f1(){

    int var1 =1000;

    int var2 =2000;

    int var3 = var1 + var2;

    return(var3 ==0)? true : false;

    }

    e8dbf5a1726bbbcd5b78ebca46a8bb39.pngf1()函数的C语言代码

    显然,函数 f1() 执行后,变量 var3 的值等于 3000,因此必定会返回 false。但是小明在 main.c 文件里编写 main() 函数调用 f1() 后,发现结果似乎有些奇怪,main() 函数的C语言代码如下:

    #include

    #include

    intmain(){

    printf(f1()== true ?"true\n":"false\n");

    if(f1()){

    printf("executed\n");

    }

    return0;

    }

    22ebb74b2c3870755e86a6826cfe57c8.pngmain()函数的C语言代码

    按理说,既然 f1() 函数总是返回 false,上述 main() 函数被编译执行后,应该只会输出“false”才对,但是小明得到的实际执行结果却是下面这样的:

    $ gcc main.c f1.c -o test

    $ ./test

    false

    executed

    这是怎么回事呢?小明使用的编译器版本为 gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2。

    分析

    仔细观察小明的编译命令gcc main.c f1.c -o test,应该能够发现他并没有指定任何别的编译选项,因此 gcc 编译器默认实现的是 1990 年(很老了)的 C90 标准。

    a77fe0b429dde5a2b6301134feb151da.pnggcc 编译器默认实现的是 C90 标准

    C90 标准在处理C语言代码时,有一个主要缺点就是:如果某段C语言代码调用函数时,程序员未能实现指定被调用函数原型,那么将使用默认的函数原型,即默认被调用函数的原型为:

    int func();

    也即默认被调用函数可以接收任意多的参数,并且返回值类型为 int。这样的默认规则在处理函数返回值时可能会有一个转换过程(当被调用函数原型返回值不是 int 类型时),但是它并不会修改实际的函数实现。

    现在小明遇到的问题就清楚了:f1() 函数原本的返回值类型为 bool 型,但是他在编写 main() 函数时,并未事先指定 f1() 函数的原型,因此编译器默认将其当作是 int 返回值类型了。

    而 bool 型和 int 型的 size 并不一致,所以小明编写的C语言程序行为就属于“未定义”的了,出现什么样的结果都是不足为奇的。

    7558da4d3d8dac7c8f1a8071413e6b48.png出现什么样的结果都是不足为奇的

    能够看出,C90 标准在遇到未知函数原型时,会默认将其当作 int func(); 原型的特性其实是一种危险的特性,因此,从 C99 标准开始,这样的特性就被禁止了。

    但是不幸的是,直到 5.x.x 版本的 gcc 默认属性仍然是较老的 C90 标准,这可能是为了兼容之前的C语言代码。要解决小明遇到的问题也是简单的,只需要告诉 gcc 编译器希望使用的标准就可以了。例如:

    gcc -std=c11 -pedantic-errors -Wall -Wextra-std=c11 用于告诉编译器遵循 C11 标准。-pedantic-errors 告诉编译器全心全意的编译C语言代码,一旦发现错误就给出错误提示。-Wall 可以尽可能的让编译器发现一些不规范的代码,并给出相应的警告提示。-Wextra 类似于 -Wall 选项,它能够让编译器发现更多不规范的代码。使用上述命令编译小明的C语言代码,应该会发现此时编译器不再能够完成编译了,而是给出了错误提示:“implicit declaration of function ‘f1’”:

    52ce63a8bdbb325e8172028e13732ffb.png错误提示

    此时,编译器不再“猜测”f1() 函数的原型,而是强制我们在调用函数前指定其原型。因此对小明的C语言代码稍作修改,如下:

    cd60fe97145d43e32c43c817fc981f8a.png请点强制我们在调用函数前指定其原型击

    此时再编译执行,发现一起符合预期了:

    # gcc -std=c11 -pedantic-errors -Wall -Wextra main.c f1.c -o test

    # ./test

    false

    小结

    很多C语言初学者觉得细节不重要,重要的是核心算法或者代码,这样的心态其实很危险,很容易写出难以捉摸的程序,本节就是一个例子。事实上,越是初学者就越应该严格遵守规范,这样才能尽可能的避免出现奇怪的,难以捉摸的结果,打击自己的学习信心。

    7b4cb9ee83cb2031bb49272b63a3ba0a.png

    点个赞再走吧

    欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

    未经许可,禁止转载。

    举报/反馈

    展开全文
  • 不对,是if(条件1) 如果条件1真,执行这里;(条件真才执行)else if(条件2)否则,当条件2执行这里。(当条件1不真,条件2执行这里)else条件1,条件2都不真,执行这里我将你的程序修改一下:#include#...

    不对,是if(条件1)  如果条件1为真,执行这里;(条件为真才执行)

    else if(条件2)否则,当条件2为真执行这里。(当条件1不为真,条件2为真执行这里)

    else条件1,条件2都不为真,执行这里

    我将你的程序修改一下:

    #include

    #include

    int main()

    {

    float a,b,c,z;

    printf("请输入方程的a,b,c:\n");

    scanf("%f,%f,%f",&a,&b,&c);

    z=(b*b)-(4*a*c);

    if(z<0){ printf("该方程无根!\n");

    }

    else

    if(z==0)

    {

    printf("该方程有重根!\n");

    printf("x=%.2f",-(b/(2*a)));

    }else{

    printf("该方程有双根!\n");

    printf("x1=%.2f,x2=%.2f",(-b-sqrt(b*b-4*a*c))/(2*a),(-b+sqrt(b*b-4*a*c))/(2*a));

    }

    return 0;

    }

    注意:else if语句之间不要{,这是一种句式。而且,记得在输入数据时,要打逗号,而且是英文逗号,下面是图:

    a35adb5ffe1764581c550f8fb557758e.png

    还有问题吗,谢谢采纳,Thanks♪(・ω・)ノ

    展开全文
  • C语言中scanf为什么没有执行呀?这里的第二个scanf()为什么没有执行呢?我设置了断点的时候也没有发现它执行。请问各位老师这是什么地方的问题?------解决方案--------------------第二个scanf指定是执行了的,只...

    C语言中scanf为什么没有执行呀?

    105401132.jpg

    这里的第二个scanf()为什么没有执行呢?我设置了断点的时候也没有发现它执行。请问各位老师这是什么地方的问题?

    ------解决方案--------------------

    第二个scanf指定是执行了的,只不过你的这两个scanf的写法有问题。

    你第一个scanf读到 \n 返回了,然后让第二个scanf去读这个\n,不还是直接返回么

    ------解决方案--------------------

    输入的字符串都在标准输入缓存中,为了避免回车键的干扰,可以在scanf前面加上fflush(stdin); 来清除标准输入的缓存。

    #include 

    #include 

    void main()

    {

    char num[50];

    scanf("%s",num);

    printf("%s\n",num);

    int len=strlen(num);

    fflush(stdin);

    scanf("%c",&num[len]);

    printf("%s\n",num);

    }

    这样就可以得到你想要的答案

    ------解决方案--------------------

    在每个最后不带\n的printf后面加fflush(stdout);

    在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);

    另外请检查scanf的返回值。

    ------解决方案--------------------

    #include 

    #include 

    #include 

    int main()

    {

    char num[50];

    scanf("%[^\n]", num); //输入test1回车,此时num读到了test1

    printf("%s\n", num);

    int len = strlen(num);

    scanf("%[^\n]", &num[len]); //这个读取到了空白字符,所以是执行了scanf,运行结果让你以为没执行而已

    printf("%s\n", num);

    system("pause");

    return 0;

    }

    解决方法

    1.在scanf输入个空格

    2.使用fflush

    #include 

    #include 

    #include 

    int main()

    {

    char num[50];

    scanf(" %[^\n]", num); //注意有个空格

    printf("%s\n", num);

    int len = strlen(num);

    scanf(" %[^\n]", &num[len]); //注意有个空格

    printf("%s\n", num);

    system("pause");

    return 0;

    }

    #include 

    #include 

    #include 

    int main()

    {

    char num[50];

    scanf("%[^\n]", num);

    printf("%s\n", num);

    fflush(stdin); //清空缓冲区

    int len = strlen(num);

    scanf("%[^\n]", &num[len]);

    printf("%s\n", num);

    system("pause");

    return 0;

    }

    展开全文
  • c语言程序的执行总是起始于什么

    千次阅读 2021-05-19 16:06:39
    C语言是一种高级语言,C语言源程序经过C语言编译程序编译之后,生成一个后缀.OBJ的二进制文件(称为目标文件),最后还要由称为“连接程序”(Link)的软件,把此.OBJ文件与c语言提供的各种库函数连接在一起,生成一...

    c语言程序的执行总是起始于main函数。在一个C语言源程序中,无论main函数书写在程序的前部,还是后部,程序的执行总是从main函数开始,并且在main函数中结束。

    1b1db7174a485b368fbd6992caa0fe8d.png

    C语言是一种高级语言,C语言源程序经过C语言编译程序编译之后,生成一个后缀为.OBJ的二进制文件(称为目标文件),最后还要由称为“连接程序”(Link)的软件,把此.OBJ文件与c语言提供的各种库函数连接在一起,生成一个后缀. EXE的可执行文件。显然C语言不能立即执行。

    一个c程序有且仅有一个main函数,除main函数之外可以有若干个其它的函数,每个函数实现某一特定的操作。

    在一个C语言源程序中,无论main函数书写在程序的前部,还是后部,程序的执行总是从main函数开始,并且在main函数中结束。

    main函数,又称主函数,是程序执行的起点,main是相对来说的,如同音学理论之主调于泛音,泛音即程序中的除main之外的其他函数,迎合人们的思考方式而生成的而非必定的模式。有主有次,执行起来条清缕析,既可将程序模块化又实现了一个闭合的整体。

    程序执行总是从main函数开始,如果有有其他函数,则完成对其他函数的调用后再返回到主函数,最后由main函数结束整个程序。在执行程序时,由系统调用main函数 。main 函数是在程序启动中完成对具有静态存储期的非局部对象的初始化之后被调用的。它是程序在有宿主 (hosted)环境(亦即有操作系统)中所指定的入口点。自立程序(启动加载器,操作系统内核,等等)的入口点则是由实现定义的。

    主函数的两个形参形式中的形参,允许从执行环境中传递任意的多字节字符串(它们通常被称为命令行参数),各个指针 argv[1] .. argv[argc-1] 指向每个这些字符串的第一个字符。argv[0] 是指向一个表示用于执行该程序自身的名字的空结尾多字节字符串(或者当执行环境不支持时,为空字符串 "")的开头字符的指针。这些字符串是可以改动的,虽然对它们的改动并不会被传回给执行环境:比如可以用 std::strtok 来使用它们。由 argv 所指向的数组的大小至少为 argc+1,其最后一个元素 argv[argc] 保证为一个空指针。

    展开全文
  • 大家一般都用的是什么软件呢?1.C语言编程软件有哪些:Mcrosoft Visual C++ 、Microsoft Visual Studio、 DEV C++、Code::Blocks、Borland C++、WaTCom C++、Borland C++ Builder、GNU DJGPP .首先你要明白编译的...
  • C语言中重复执行程序的问题

    千次阅读 2021-05-19 12:45:42
    小弟我写了如下一段代码: #include #include #define n 1/*... if(order=='r') { (请高手填写部分) } } 现在想请高手解答一下如何使我在键入‘r’之后程序可重新执行,最好不要用goto语句,小弟万分感激。 展开 全部
  • c语言为什么执行n次,就结束程序?答案:5信息版本:手机版解决时间 2019-10-06 04:33已解决2019-10-05 09:25#include#includeint main(){int n;char a[20];scanf("%d",&n);while(n--){scanf("%s",a);printf...
  • c语言执行命令快捷键是什么??

    千次阅读 2021-05-23 12:12:41
    ALT+ Break 停止调试 CTRL + SHIFT + F9 取消所有断点 CTRL + F9 允许中断 CTRL + SHIFT + F5 调试-重新开始 F5 运行调试 CTRL + F5 运行不调试 F10 跨过程序执行 F11 单步逐句执行 CTRL + J 列出成员 CTRL + PAGE ...
  • “Option”—>“Directories”,发现路径有误,重新设置“Excutable Fils,Include Files,Library Files...2、如果是按照初始路径安装vc6.0的,路径应:executatble files:C:\Program Files\Microsoft Visual ...
  • C语言编译和执行分析

    2021-05-20 12:17:43
    和大部分人一样,做对C语言编译之后的运行方式的充满了好奇,主要包括一下几个方面:可执行程序是什么,里面只是包括一大堆机器码吗?C语言中定义变量, 常量, 函数等等,在内存中是如何分布的,它们之间是靠什么相互...
  •  /*转向switch语句下一条语句*/ case '/': /*当输入运算符"/"时,执行语句如下*/ while(second_number==0) /*若除数0,重新输入算式,直到除数不0为止*/ { printf("除数0,请输入一个算式:");...
  • C 语言程序仅可以解释执行。解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。编译程序是把高级语言(如FORTRAN、COBOL、Pascal、C等)源程序作为输入,进行翻译转换,产生出...
  • C语言中for语句的执行过程是:1、会先判断条件表达式是否...C语言中for语句的执行过程是:for语句的一般形式:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。for循环执行时,会先判断条件表达式是否成立...
  • c语言程序从什么开始执行发布时间:2020-07-20 13:55:39来源:亿速云阅读:70作者:Leahc语言程序从什么开始执行?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你...
  • #include <stdio.h> #include <stdlib.h> #include <time.h> int i; int main() { clock_t begin, end; double cost; //开始记录 begin = clock(); /*待测试程序段*/ ... //结束记
  • c语言程序从哪里开始执行

    千次阅读 2021-08-11 00:09:28
    c语言程序的执行总是起始于main函数。在一个C语言源程序中,无论main函数书写在程序的前部,还是后部,程序的执行总是从main函数开始,并且在main函数中结束。但需要注意的是,也是有...
  • C语言生成可执行文件的过程

    千次阅读 多人点赞 2021-02-15 11:07:05
    今天用gcc编译器大家演示一下c语言的编译过程 首先,我们将贴上我们朴实无华的源代码 1. 预编译过程 由.c --生成–> .o文件 通过 gcc -E main.c -o main.i 执行c语言的预编译过程,生成main.o文件 让我们...
  • C语言程序仅可以编译执行

    千次阅读 2021-05-19 12:55:28
    首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档C语言函数可以嵌套调用,例如,fun(fun(x))简单C语句必须以分号结束计算机不能直接执行C语言编写的源程序C程序经C编译程序编译后,生成后缀....
  • 然后由“连接程序”,把此“.obj”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.exe”的可执行文件。教程推荐:《c语言教程视频》C语言源程序经过C语言编译程序编译之后,生成一个后缀“.OBJ”的二进制...
  • c语言 为什么这个程式执行不到,哪里出错呢?求大神解释以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!c语言 为什么这个程式执行不到,哪里出错呢?...
  • 为什么这样?很玄妙: rwtab数组少一项,rwtab[26]会引用一个空指针,产生错误。这儿没有语句时,循环没有实质性语句,编译程序优化, 不会编译这个循环的语句,程序中根本没有这几句的内容,因而不会出错。有了...
  • 一个C语言程序总是从( )开始执行

    千次阅读 2021-05-19 12:08:50
    在Word中有四大核心技术,个C语言程下面 不是这四大核心技术之序总...尺寸界线一般与尺寸线垂直,执行必要时才允许倾斜,并应超出尺寸线终端2~3mm经济文化相对落后国家选择社会主义道路,个C语言程表明( )十月革命发...
  • C语言程序在执行时,有三种最常见的流程: (1)顺序执行流程; (2)条件分支选择流程; (3)循环执行流程。 也许会有读者指出,还有使用goto语句的流程。由于goto语句产生的跳转,会导致程序出现混乱,所以...
  • /* IncInfo0则弧不含其它信息 */ printf("输入顶点名称"); for(i=0;i {scanf("%c",&G.vexs[i]);printf("%d",i);}for(i=0;i for(j=0;j {G.AdjMatrix[i][j]=0;} printf("输入BIAN"); for(k=0;k {printf("%d",G....
  • C语言中的每条可执行语句都将转换成二进制的机器指令。C语言中的非执行语句不会被编译,不会生成二进制的机器指令。C语言不仅可以发挥出高级编程语言的功能,还具有汇编语言的特点。C语言中的每条可执行语句最终都将...
  • C语言从代码变成可执行程序的步骤:预处理----->编译----->汇编----->链接⒈预处理:去掉注释,加载头文件,代替宏定义,条件编译需要文件:.c文件生成产物:预处理文件(以.i结尾)使用方法:gcc hello.c -E...
  • 原标题:基础C语言6:流程控制之选择执行一、定义和分类1、定义通俗来讲选择执行就是代码可能执行,也可能不执行,有选择的执行某些代码2、分类if 语句,switch 语句(switch后面再补充)二、if 语句1、if 最简单的...
  • C语言–计算程序执行时间1. gettimeofday精度1us#include#includeint main(){/* 定义两个结构体 */struct timeval start;struct timeval end;unsigned long timer;/* 程序开始之前计时start */gettimeofday(&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 513,847
精华内容 205,538
关键字:

为什么c语言无法执行

c语言 订阅