执行fprintf(fp, "%d%d", a[0], a[1])后
ddat文件大小为4字节,其中的内容为"6566"
使用fscanf(fp, "%c", &ch)后
取到文件的第1个字节'6',字符'6'的ascii为54
第一次printf("%d", n%10); 输出54%10 --> 4
n = n / 10 = 54/10 = 5
第二次printf("%d", n%10); 输出5%10 --> 5
所以incx都是输出x=1;
incy输出为y=1
,2,3,这个考静态变量和局部变量,静态变量static声明后变量在静态区在整合程序运行期间其值都存在,每次加一都是在原来基础上调用,二局部变量调运结束就释放,所以每次都会调运x=0,然后输出++x时其值为1
union是用来定义联合体的关键字,union维护足够的空间来置放多个资料成员中的最大的“一种”,而不是为每一个资料成员配置空间,在union中所有的资料成员共用一个空间,同时间只能储存其中一个成员的资料。
可以得出该共用体在内存中占用4个字节。
ka[0]=10000; ka[1]=15000; 为k的int a[2]成员赋值,即该内存的内容是[00111010] [10011000] [00100111] [00010000]将这4个字节换算成符点数就是0001161
scanf ("%s",kd); //kd[]="abcd"
因为scanf把4个输入压栈后再出栈对4个字符变量赋制值,则内存结构为:
[01100100] [01100011] [01100010] [01100001]
d[3] d[2] d[1] d[0]
c(4个字节)
b(前两个字节)
a[1](前两个字节) a[0](后两个字节)
将这4个字节换算成符点数c就是:16777999408082104400000000000
至于上面的数字是怎么得来的,那要考虑浮点数在计算机中的储存结构问题了在存储1个浮点数的32位内存中,
第一位是符号位,下来的8位是指数位,后面的23位是尾数位
[01100100] [01100011] [01100010] [01100001]
换算成浮点数的算法是:
第一位为0:正数
下来的8位是:[11001000],减去[01111111]为[1001001]所以指数为73
再下来的23位是1100011[01100010] [01100001]所以尾数为
(111000110110001001100001)B = 2^0+2^(-1)+2^(-1)+2^(-6)+2^(-7)+2^(-9)+2^(-10)+2^(-14)+2^(-17)+2^(-18)+2^(-23)
最后结果=底数^指数
可能你还会问为什么位数一样,结果还是有差距,那是因为浮点数的计算精度问题浮点数的精度是有限的
#define PRINT(a) {PR(a); printf("ok!");}
楼主请注意加花括号。否则 的话printf("OK!");就成了for循环以后才打印的
因为ofr只能处理一个语句。
所以要花括号
你自己写的。。。#define PR(a) printf(“%d\t”,(int)(a))
显然是一个退格键的空格
把代码稍微格式化了一下,这样看着会舒服一些
首先程序switch(x),由int x= 1,可知它会进入case 1
接着就执行到了switch(y),由int y = 0可知它会进入case 0:即a++,此时a=1,b=0
由break结束掉(此时结束的是switch(y))以后,此时程序运行到case 2上边的花括号 }这里,由于没有break,所以它会顺序执行case 2:执行了a++,b++,此时a=2,b=1
遇到break,跳到printf上面的花括号,接着执行printf()
所以最终输出是a=2,b=1
sizeof(a)是求字符数组a在内存中占的字节数
所以
sizeof(a)==a数组的元素个数20 sizeof(char)==20
strlen(a)是把a数组作为字符串处理,求字符串的长度
strlen这个函数遇到'\0'就会停止运行
所以strlen(a)==6
char a[20]="Good\t\\\0China";
相当于:
char a[20]={'G','o','o','d','\t','\\','\0','C','h','i','n','a'};
所以
strlen(a)==6 ('G'到'\\')
main()
{
char c[]={"ENTER","HOME","END","NISERT"};
char cp[]={c+3,c+2,c+1,c};
char cpp=cp;
printf("%s\n",++cpp); //结果为:END,因为cpp已指向了cp,++cpp后cpp就指向了cp+1,表示取值,取值后结果为c+2,输出c[2]的值为END
printf("%s\n",--++cpp+3); //结果为:ER,因为cpp已指向了cp+1,++cpp后cpp就指向了cp+2,表示取值,取值后结果为c+1,又自减一次,相当于c,c是C数组的首地址,相当于C[0],取值后就是ENTER的首地址,也就是E的地址,向后+3后走到了第二个E的地址处,输出的值为END
printf("%s\n",cpp[-2]+3); //结果为:ERT,因为cpp已指向了cp+2,cpp[-2]表示取向前移动2次后的值,相当于cp[0],也就是c+3,取值后就是NISERT的首地址,也就是N的地址,向后+3后走到了E的地址处,输出的值为ERT
printf("%s\n",cpp[-1][-1]+1); //结果为:OME ,因为cpp已指向了cp+2,cpp[-1]表示取向前移动1次后的值,相当于cp[1]的值,也就是值项为c+2, 再有一个[-1],表示指针向前再移动一次,就是C+1的首地址,相当于HOME的首地址,+1表示向后移动一次,刚好移动到HOME中O的地址处,输出的值为OME
}
以上就是关于请教各位这道c语言程序该怎么分析全部的内容,包括:请教各位这道c语言程序该怎么分析、c语言程序分析,麻烦会的亲解释一下,谢谢、分析c语言程序---结构体程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)