c语言代码讲解,C语言求详解

1,C语言求详解每次赋值,变量数值分别为i=0, a=0;i=11, a=11;i=21, a=32;输出32一直输出a=0,因为0求余10一直为0,所以for循环里一直break , i的值一直为0,a的值也一直为0,这是个死循环你这程序好像有点问题?。∷姥钒 。∧愫?nbsp;, 能不能把你的问题打上来!谢谢
2,c语言 程序解释首先你要知道fun()函数里面的m和主函数main()里面的m是不同的,那么你把fun()里面的m换成别的变量就容易理解了,例如:#include int fun(int x,int y) { static int q=0,I=2; I+=q+1; q=I+x+y; return q; } void main() { int j=1,m=1,k; k=fun(j,m); cout<<打错了,第二次调用最后那里改成”所以第二个k=11“
3,C语言代码解释break用来跳出循环;执行下面的代码 。continue用来跳出本次循环,单下次循环还会进行 。p==0和p==1之间两个竖杠是逻辑或运算 。如果p==0和p==1两个表达式其中任何一个为真 。那么这个逻辑表达式就为真 。printf的声明int printf(const char *format, ...);printf函数是参数个数可变的,第一个参数是一个char*类型(不允许修改)的(x%2)?("**%d"):("##%d\n") 是一个表达式,如果x是偶数表达式的结果是 "##%d\n"的地址如果x是奇数,结果是"**%d"的地址printf会根据这个地址找到字符串,然后分析这个串,来打印信息.不知是否解释清晰定义一个整形x循环体内首先x赋初值3 , 如果x<6的话执行printf((x%2)?("**%d"):("##%d\n"),x);这语句语句意思是:x与2取余,如果都是真(余数为1的话执行("**%d")),如果是假(余数为0的话执行("##%d\n"))就是说x%2如果真的话语句变成printf("**%d",x);反之亦然然后x自加,一直到x>=6为止 X=3,3%2=1,输出**3X=4,4%2=0,输出##4\nX=5,5%2=1,输出**5二楼的 3个爱到吐\n 是表示输出后换行光标会显示到下一行我看你答得倒是对的但怎么连这个都不知道??(x%2)?("**%d"):("##%d\n")是一个条件表达式?:是条件运算符当表达式1:(x%2)成立时,整个表达式取表达式2:("**%d")的值,否则等于表达式3:("##%d\n")的值 。循环时:X=3,3%2=1 , 输出**3X=4 , 4%2=0,输出##4\nX=5,5%2=1 , 输出**5【c语言代码讲解,C语言求详解】
4,一个简单的c语言程序解释一下f(int a)这个是函数名 类型是int 的(没写)auto 是定义局部变量,局部变量在自己的代码模块之外是不可知的static是静态存储类型,就是在整个程序中都能用这个变量.然后就返回a+b+c;主函数里循环三次,得出三个答案...2+1+4,2+1+5,2+1+6....其实就是考你auto 和static 的用法!f(int a) ........定义f()函数体 , 他的参数是a,int类型static c=3; ...........定义静态存储变量c=3b=b+1; ..................每次调用时b+1,相当于b++c=c+1; ................每次调用时c+1,相当于c++return(a+b+c); .................把a+b+c的值返回到printf("%d",f(a)); 中的f(a)}main()for(i=0;i<3;i++) ..............建立一个for循环printf("%d",f(a)); ..............输出printf("%d",f(a))共三次} f(int a) // 为要调用输出的函数内容static c=3; //定义静态存储变量c=3b=b+1; //每次调用时b+1,由于是局部变量 所以第一次b=1,第二次b=1,第三次b=1c=c+1; //每次调用时c+1,由于是静态变量 所以第一次c=4,第二次c=5,第三次c=6return(a+b+c); //故三次调用的答案分别为2+1+4,2+1+5,2+1+6}main()for(i=0;i<3;i++) //建立一个for循环printf("%d",f(a)); //因为i=0,i<3,所以在这个for循环下一共输出printf("%d",f(a)); 三次}在return a+b+c中一直都是a=2,b=1,主要是c是static意思是直到整个程序结束后才释放空间 , 所以第一次c=3+1=4,第二次是c=4+1=5,第三次是c=5+1=6,于是最后结果是7 8 9首先呢,“f(int a)这个是函数名 类型是int 的(没写)”其实,为int型的函数 可以不写int的 f()前面什么也没写的自动认为是int 。auto为是自动变量,写不写都一样的其实,auto的变量在函数运行结束后自动释放空间 , 也就是说它就不存在了 。static为静态变量 , 是整个程序运行结束后才释放空间,也就是说在程序没有全部结束之前,赋值是永远保留上一次的赋值的 。本题中,自定义函数f中的b,每次调用f函数都是一个“新的”值,而c为一直都保留着上一次运行时c被赋的值 。我这么说,你应该就能明白了吧循环调用三次 变量B每次清0,变量C每次保持上次的结果,所以结果是7,8,9f(int a)static c=3;<-----static变量不用进入该函数也存在,而且只有第一次进入该函数时才会执行赋初值这一指令,以后再进入该函数不会再赋初值了,因为它一直存在(即内存没被释放),(注意是不会赋初值了,它的值就是上一次退出该函数时的值 , 但可以改变它的值 。)b=b+1;<----b因为是auto,退出时就不存在了,所以值也会消失,所以它的初值总是一样c=c+1;<------C的值将一直保留,不断增加return(a+b+c);}main()for(i=0;i<3;i++)printf("%d",f(a));}相信懂了上面 , 自己就能分析吧?5,c语言代码求解释int main() /*声明int型数组a[5]*/int a[5]= /*取数组a的地址,然后加1一个a类型的长度,将该地址*赋给ptr1效果相当于让ptr1指向了存放5的那个地址的后一个*/int *ptr1=(int *)(&a+1);/*将a[5]这个数组的首地址转换为int型然后再+1得到新地址ptr2*ptr2所指的区域占a[0]的后三个字节(int型为4字节),和*a[1]的第一个字节*/int *ptr2=(int *)((int)a+1); /*ptr1所指的是a+5这个地方,偏移量是-1故ptr1[-1] = a[4] = 5,*ptr2上面说了,然后以十六进制打印出来*/printf("%x,%x",ptr1[-1],*ptr2);return 0;}这段代码请简单,主要就是一个float的变量salary , 然后就是一个scanf要求用户输入,然后就是倒数第二个printf语句,其余的printf语句都是提示语句 , 可有可无!还有\a \b这些都是转义字符,相信你在书上能找到他们代表干什么,就相当于\n是换行一样,只是他们的作用是别的,而不是换行!scanf要求你输入一个浮点型的数应该没问题吧?然后就是倒数第二个printf语句,里面有两个%.2f , .2的意思是保留两位小数,ok 应该没问题吧?int *ptr1=(int *)(&a+1);这句是让ptr1指向内存中a的地址末尾加1个字节的位置.ptr1[-1]就相当于指针向前移动一个int大小的位置,刚好就是a[5] 内存所在 。也就是ptr1[-1] = a[5];int *ptr2=(int *)((int)a+1);这句是让ptr2指向内存中a的地址开头加1个字节的位置.内存中表现如下a[0] 01 00 00 00a[1] 02 00 00 00a[2] 03 00 00 00a[3] 04 00 00 00 a[5] 05 00 00 00 此时ptr2在内存中就是00 00 00 02,实际值就是0x02000000.#include <stdio.h>int main()int a[5]=int *ptr1=(int *)(&a+1);// 定义int 类型指针;&a = a = 首地址 但是指针类型变为指向 a[5]的指针;所以后来 +1 就相当于在这个基础上加了 5*sizeof(int) 个内存单元int *ptr2=(int *)((int)a+1);//这里将指向int的指针类型直接 int 化转为地址值 +1将地址简单加 1 , 即简单加了1个字节的偏移量printf("%x,%x",ptr1[-1],*ptr2);//ptr1[-1]ptr1 是指向int 的指针类型 -1 即地址的偏移量 减去 1*sizeof(int) 。ptr2 是指向int类型的指针 所以这里是取他里面的内容,但是这个指针所指的地方在上面被指定了地址值,里面的内容就是在 a[5] 数组里内存单元截取的值,这里的值的取值 和内存的字节序有关系 , 就是还要看一个int值高地位是怎么存放的return 0;}int *ptr1=(int *)(&a+1);//a本身是数组的首地址,那么对&a 就是a实际地址 , 虽然 数组a的首地址的就是&a的地址,但是,重点来了:a + 1不等于&a+1 哦 ,  a+1 的值为 a+ sizeof(int)*1最后的值为&a[1] ,&a +1的值为a + sizeof(int[5] )就是数组a 最后一个元素后面的那个地址!相当与&a[5],将这个值给ptr1, 那么ptr就指向了&a[5](实际没有这样一个元素),那么在prinf中ptr[-1] 的意思就是 *(ptr -1 )就为a[4]就是等于5?。。?int *ptr2=(int *)((int)a+1);//(int)a 就是把a变成一个int型数字 , 那么int(a) + 1就是这个数字加1,(int*)((int)a +1) 就 是把这个数字再变成地址保存在ptr2 中 ,  引用一下楼上的,数组a在内存中的存贮形式是:“a[0] 01 00 00 00a[1] 02 00 00 00a[2] 03 00 00 00a[3] 04 00 00 00 a[5] 05 00 00 00 此时ptr2在内存中就是00 00 00 02 , 实际值就是0x02000000.为什么是0x02 00 00 00 呢,入栈时候01 00 00 00 02 00 00 00 03 .....那么出栈时候就是02 00 00 00 00。

    推荐阅读