[C/CPP系列知识] 在C中使用没有声明的函数时将发生什么 What happens when a function is called before its declaration in C...

http://www.geeksforgeeks.org/g-fact-95/

 

1 在C语言中,如果函数在声明之前被调用,那么编译器假设函数的返回值的类型为INT型,

所以下面的code将无法通过编译:

#include <stdio.h>
int main(void)
{
    // Note that fun() is not declared 
    printf("%d\n", fun());
    return 0;
}
 
char fun()
{
   return 'G';
}

错误:其实就是fun函数定义了两遍,冲突了

test1.c:9:6: error: conflicting types for 'fun'
 char fun()
      ^
test1.c:5:20: note: previous implicit declaration of 'fun' was here
     printf("%d\n", fun());
                    ^

 

将返回值改成int行可以编译并运行:

#include <stdio.h>
int main(void)
{
    printf("%d\n", fun());
    return 0;
}
 
int fun()
{
   return 10;
}

 

2 在C语言中,如果函数在声明之前被调用,如果对函数的参数做检测?

compiler assumes nothing about parameters. Therefore, the compiler will not be able to perform compile-time checking of argument types and arity when the function is applied to some arguments. This can cause problems.

编译器对参数不做任何假设,所以无法做类型检查。 下面code就会有问题,输出是garbage

#include <stdio.h>
 
int main (void)
{
    printf("%d", sum(10, 5));
    return 0;
}
int sum (int b, int c, int a)
{
    return (a+b+c);
}

 

输出结果:

diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
1954607895
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
1943297623
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
-16827881
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
67047927
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
-354871129
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
-562983177
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
33844135
diego@ubuntu:~/myProg/geeks4geeks/cpp$

 

 

所以It is always recommended to declare a function before its use so that we don’t see any surprises when the program is run (See this for more details).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ARM7处理器,当执行寄存器加载(register load)或寄存器存储(register store)指令,指令流水线的情况如下所示: 1. 取指令(IF)阶段:在这个阶段,处理器从内存获取下一条待执行的指令。对于寄存器加载或存储指令,处理器将读取并解码该指令。同,程序计数器(PC)会自增,以便在下一个钟周期读取下一条指令。 2. 指令译码(ID)阶段:在这个阶段,处理器识别并解码指令,并确定指令的操作类型。对于寄存器加载或存储指令,处理器会解析出要加载或存储的寄存器编号,并在寄存器文件获取相应的数据。 3. 执行(Execute)阶段:在这个阶段,如果是寄存器加载指令,处理器会从寄存器文件读取相应的数据,并将其传递给下一个阶段进行操作。如果是寄存器存储指令,处理器会将要存储的数据传递给下一个阶段。 4. 存储(Memory Access)阶段:对于寄存器加载指令,这个阶段不涉及任何操作。对于寄存器存储指令,处理器会将要存储的数据写入到内存的指定地址。 5. 写回(Write Back)阶段:对于寄存器加载指令,处理器将从上一个阶段接收到的数据写回到寄存器文件的目标寄存器。对于寄存器存储指令,这个阶段不涉及任何操作。 下图是一个简化的ARM7指令流水线示意图,说明了寄存器加载和存储指令在指令流水线的各个阶段的处理情况: ``` |-----------------|-----------------|-----------------|-----------------|-----------------| Cycle: | IF | ID | Execute | Memory Access | Write Back | |-----------------|-----------------|-----------------|-----------------|-----------------| | Fetch Instr | Decode Instr | Load Regs | | | |-----------------|-----------------|-----------------|-----------------|-----------------| | | Read Regs | Operate | | | |-----------------|-----------------|-----------------|-----------------|-----------------| | | | | Access Memory | | |-----------------|-----------------|-----------------|-----------------|-----------------| | | | | | Write Regs | |-----------------|-----------------|-----------------|-----------------|-----------------| ``` 上述图表的每个阶段都代表一个钟周期。在每个钟周期内,不同的指令在指令流水线的不同阶段并行执行,从而提高了指令的执行效率和吞吐量。 请注意,实际的ARM7处理器可能具有更多的流水线阶段和更复杂的流水线结构,这里仅提供了一个简化的示意图来说明寄存器加载和存储指令在指令流水线的处理情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值