1 打印“=”
#includeint main(int argc,char *argv[]){ for(unsigned int i=3;i>=0;i--){ putchar('='); } }
这道题问的是可以打印出来的“=”的数量,我认为可以打印出来二的三十一次方加上四个“=”,在unsigned int i=3的情况下,可以得到最重要的问题是unsigned的情况,不然可以很容易得到打印出来是四个“=“
那么unsigned是什么意思呢,在变量类型前面加上unsigned可以得到变量的补码形式,那么3的补码得到的结果最后还是3那么看样子没有什么意义,但这是int类型,在进行累减的过程中i会变成-1那么这个时候就变得有意思了,i作为一个无符号数,它会变成1但里面的int i是-1,所以在往后的过程中是会一直输出一直到无法在int类型里面保存才会停止
2.在三种交换方式中考虑如何交换
int c=a; a=b;b=c;
这里使用一个变量保存了a的值,然后把b的值赋给a,最后把c的值给b就好了
a=a-b; b=b+a;a=b-a;
这个使用数学的方法,当两边和到一起时会得到a+b=a+b,所以说可以对这个扩大数据,然后对这个进行修改放缩
a^=b; b^=a;a^=b;
这是使用的异或进行解决的,a^=b可以理解成为a=a^b,这里是使用二进制来进行行,当同一位相同时对应结果为0否则为1.举一个例子a=1011,b=0111.那么第一轮异或之后可以得到a=1100,b=1011那么这个时候再进行一次异或便可以得到a=0111,也同样交换了数值
3.
执行下面的函数,对输出进行说明,同时重复调用
#includevoid f(){ static int a=0; int b=0; printf("%d ,%dn",++a,++b); } int main(){ f(); f(); }
在这里我调用了两次函数,但已经足以说明问题了。
1 ,1 2 ,1
这里的a会不断的上升,主要原因是这里的a被设置成为了全局变量,只不过写在了函数里面罢了。那么在每一次函数调用结束a都会被累加,但b会在下次函数调用的时候变成0准确来说,在函数调用结束,这个b变量就会被消除,在下一次函数使用的时候再进行调用变量空间。所以调用几次函数,a便会是几,但b不会变,只要调用函数,b就是1
4. 下面程序的输出和原因
#includeint main(){ printf("%dn",printf("xiyou linux group2%d",printf(""))); }
这个会输出“xiyou linux group2019”这个在从外往里面输出可以得到,第一个出来的参数是0即printf("")输出部分,那么会得到第一个参数,然后对第二个进行输出,得到xiyou linux group20,最后printf会对这这一行参数进行读取,可以得知一共19个字符,所以在最后会输出19最后便可以得到答案xiyou linux group2019
5.判断输出
#includeint main(int argc,char *argv[]){ char ch=255; int d=ch+1; printf("%d %d",ch,d); }
这里最后可以得到结果是-1和0,char ch=255会造成溢出。
将这里的255看作数字的补码,因为正数的补码都是其本身,这时候可以先把255看成一个int类型的变量。其反码减一可以得到1111 1110所以再返回来可以得到源码为10000001,所以结果为-1,不管其怎么去存,重点是怎么去读它。在得到的d刚刚好是-1+1得到了结果为0
6.执行代码,得到输出
#includeint main(){ char x=-2,y=3; char t=(++x)|(y++); printf("x=%d ,y=%d,t=%dn",x,y,t); t=(++x)||(y++); printf("x=%d ,y=%d,t=%dn",x,y,t); }
在这里得到结果为
x=-1 ,y=4,t=-1 x=0 ,y=5,t=1
观察代码,会发现第一次计算值后会对x和y进行计算,同时会得到 t=-1。这里是对其进行一次逻辑判断,得到的答案是-1即两个中间有一个小于0,那么进行第二次判断,得到x,y的数值之后在进行判断,即或语句。得到t为1
7.输出结果
#include#define x a+b int main(){ int a=1,b=1; printf("%dn",x*x*5); }
输出结果为3
在定义宏函数之后,#define n 10 并不是n=10的意思,而是代表用10替换掉n所以也就很好得到这个结果为3了,举个例子
#include#define x a+b int main(){ int a=1,b=2; printf("%dn",x*5); }
会得到答案为11。
8.
int val=2018;
这一串的意思是给val赋值2018
int *pi=2019
取地址为2019
pi=&val;
把val的地址赋给Pi
*pi=0
pi指向空
9.判断字符输入会是什么结果
#include#include int main(){ char *p=(char *)malloc(sizeof(char)*20), *q = p; scanf("%s %s",p,q); printf("%s %sn",p,q); }
输出为
xiyou linux linux linux
这里从开始分析,*p得到一份空间,一共二十个字节,然后把p赋给了*q那么的话,q里面存的是p的地址,那么再输入之后,可以得到在这里P是什么值并不重要,重要的是q里面的值。
相应的,如果我在里面输入wu qihao 便可以得到qihao qihao
10.输入,并且输出
ncludeint main(){ int a[4]={2,0,1,9}; printf("%p ,%pn",a,&a); printf("%p ,%pn",a+1,&a+1); }
这个得到的答案为
000000000062FE10 ,000000000062FE10 000000000062FE14 ,000000000062FE20
这个答案在我的编辑器上不会发生改变。那么重要的就是解释问题了
在确定一个变量的时候系统会给它分配一段空间,在这个变量名为int 类型的情况下,相邻的应该加4,同时%p和&都有和地址有关系,那么便会得到printf("%p ,%pn",a,&a);得到的答案相同,但
在打印第二行时发生了改变,a+1的确是a的字节数加上int类型所拥有的字节数量,而这个为什么会是000000000062FE20呢,我认为这里是像&a+1=a[4+1]这样的变化
11.斐波那契数列
#includeint main(){ int n; scanf("%d",&n); double a[n+1]; a[0]=0; a[1]=1; a[2]=1; for(int i=3;i<=n;i++){ a[i]=a[i-1]+a[i-2]; } printf("%0.2f",a[n]); }
12
#includeint main(){ int nums[6]={6,3,2,4,5,1}; for(int i=0;i<6;i++){ for(int j=i;j<6;j++){ if(nums[i]>num[j]){ int c=num[s]; nums[i]=nums[j]; nums[j]=c; } } } }
这个是冒泡排序, 可以对其进行改进。
改进一:当某一次执行了一次排序之后所有成员都没有位置发生了改变,则设置a变量,使循环跳出
改进二:在每轮排序的最后,记录下最后一次元素交换的位置,下次走到这里就可以直接跳出了
当然也有其他的排序方法,比较特殊的是快速排序我认为,在快排的过程中,会有两个基准的变量和一个变化的数
1、选出一个key,一般是最左边或是最右边的。
2、定义一个a和一个b,a从左向右走,b从右向左走。(需要注意的是:若选择最左边的数据作为key,则需要b先走;若选择最右边的数据作为key,则需要a先走)。
3、在走的过程中,若a遇到小于key的数,则停下,b开始走,直到L遇到一个大于key的数时,将b和a的内容交换,a再次开始走,如此进行下去,直到b和a最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)
经过一次单趟排序,最终使得key左边的数据全部都小于key,key右边的数据全部都大于key。
然后我们在将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作.
阐述(大端和小端)并且对字节电脑使用的进行验证。
大端模式:
字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式:
与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
int main()
{
short int x;
char x0,x1;
x=0x1122;
x0=*((char*)&x);
x1=*((char*)&x + 1);
printf("x0=%xnx1=%xn",x0,x1);
}
如果x0=0x11则是大端,如果是x0=0x22则为小端



