c语言 这个程序是什么意思,为什么输入7会出来13??过程是怎样的呢
一般出现这样大的数值输出,有两种可能.
一种是输入读取错误.
另一种是运算中某个变量没有初始化.
建议上传代码具体分析.
楼上说的基本正确,printf的各个项是从右往左计算的,但是注意printf是函数,这个是传入函数的过程,而不是所谓”打印“的过程!(注意,这个在C标准是未定义的,只是编译器大多是这么实现的)
调用函数之前会把所有表达式算好一个个放到运行栈(就相当于是某个即将给函数的缓存)(32位是栈,64位是寄存器,按 rdi, rsi, rdx, rcx, r8, r9顺序)里,然后再进入子函数!所以是,先算++i,得5(i不变),放入栈里,然后算i++,得7,放入栈里,最后再一起传进去执行printf!
要么楼上怎么解释printf("%d,%d",++i,++i);输出7,7的问题!
以及这种代码肯定没几个人会写,题主也不大可能自愿写这种东西,但是C笔试经常有这种问题!不是”实际生活“中不用这种知识,就不用深究了!
附上原问题(输出7,5)的汇编代码:
答主如果看得懂,这里是主要的部分:
call__main
movl$5, -4(%rbp) #赋值i=5,i就存在-4(%rbp)
movl-4(%rbp), %eax #eax后面赋值给了r8d,是printf的第三个参数
leal1(%rax), %edx #给printf第一个参数
movl%edx, -4(%rbp) #这两句计算++i
addl$1, -4(%rbp) #计算i++
movl-4(%rbp), %edx #给printf的第二个参数
movl%eax, %r8d #给printf的第三个参数(前面存在%eax了)
leaq.LC0(%rip), %rcx #这个是把前面定义的字符串常量(.ascii "%d,%d\0")传到第一个参数
callprintf
movl$0, %eax #return 0
addq$48, %rsp
popq%rbp
ret
输入7,输出:n = 7
调用:fun(7),g=7,switch语句没有满足条件的分支
调用:fun(g-1),g=6,switch语句没有满足条件的分支
调用:fun(g-1),g=5,switch语句没有满足条件的分支
调用:fun(g-1),g=4,switch语句没有满足条件的分支
调用:fun(g-1),g=3,switch语句没有满足条件的分支
调用:fun(g-1),g=2,返回1【fun(2)=1】
调用:fun(g-2),g=1,返回1【fun(1)=1】
返回:1+1=2【fun(3)=2】
调用:fun(g-2),g=2,返回1,参照上边得出的结果【fun(2)=1】
返回:2+1=3【fun(4)=3】
调用:fun(g-2),g=3,最终返回2
返回:3+2=5【fun(5)=5】
调用:fun(g-2),g=4,fun(4)=3
返回:5+3=8【fun(6)=8】
调用:fun(g-2),g=5,fun(5)=5
返回:8+5=13,【fun(7)=13】
输出:fib = 13
int a,b;
scanf("%d%d",&a,&b);//参数必须是指针(地址)才可以。
scanf()函数要求参数必须是指针类型,即将地址传输到其内,才可以让a , b变量中获取到数据。
如果你学过指针,你就会理解了。
C语言中函数的调用中,参数传递,只能传递数值。如果只是将数值传递过去(接收者是形参),在子函数中变化,形参的变化,不会影响到实参数据的内容。
C中,每定义一个变量,系统都会在内存中给其分配一个空间用来存储数据。而这个空间的编号就是这个变量的地址。当我们将这个地址传递到子函数中,子函数在操作数据时,就会改变这个地址中的数据,这样,实参的数据是会发生变化。
而你程序中,传递的是a b本身的值(可能是0,可能是1,可能是任意的数),scanf()将这两个值当作地址去操作,因此会产生系统错误,导致程序运行停止。
不知道和case 0那句没加break有没有关系。
黄狮金匮: C语言是Combined Language(组合语言)的中英混合简称.是一种计算机程序设计语言.它既具有高级语言的特点,又具有汇编语言的特点.它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算...
华阴市17064081554: 计算机中的c语言是什么意思? - ?
黄狮金匮: C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围广泛...
华阴市17064081554: 这个c语言程序是什么意思 - ?
黄狮金匮: 这个程序是考查“联合体”的使用以及整数的“低位在前”的存储格式.这个程序大概是在16位的C编译系统下(int占2个字节).就是一个int与2个char共用同一片内存.给2个char分别赋值,然后再以int的格式读取这2个字节的值.最后的输出是:0*256+13=13 即输出13
华阴市17064081554: C语言是什么 - ?
黄狮金匮: 进行程序设计,必须使用一种计算机语言作为工具,否则只是纸上谈兵.可供选择的语言很多,各有各的特点和应用领域.c语言功能丰富,表达力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有...
华阴市17064081554: C语言里的程序 ()什么意思啊 - ?
黄狮金匮: ()里面要写的就是函数的参数 ,比如每一个程序里必须要写的 void main() 函数,虽然主函数里面没有参数,但是()依然不能少,又比如可以写一个求两者之中较大值的函数 int max(a,b)在这个函数里面,()中间的a, b 就是函数的形参.总的来说,()里面写的就是函数的参数,如果没有参数,()里面就什么都不写,但是()一定不能少.如果还有什么疑问,私信我,乐意解答.
华阴市17064081554: 计算机c语言是什么意思 - ?
黄狮金匮: C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.C语言也很适合搭配汇编语言来使用(往往可以通过内联汇编语言或与汇编语言目标文件一起连接.对于任何一种操作系统环境,C函数的ABI(ApplicationBinaryInterface)与汇编语言的子过程(routine/procedure)的ABI一定是完全兼容的).尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台.
华阴市17064081554: c语言是怎么回事 - ?
黄狮金匮: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型...
华阴市17064081554: c语言到底是怎么回事 - ?
黄狮金匮: C语言的发展历史 C语言的原型ALGOL 60语言.(也称为A语言) 1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言. 1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语...
华阴市17064081554: C语言到底是个什么东西?讲的是什么? - ?
黄狮金匮: c语言 C语言是目前世界上流行、使用非常广泛的高级程序设计语言.C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的.C语言具有绘图能力强,可移植...