int main() { for(unsigned int i=3;i>=0;i--) putchar('='); }
输出无数个“=”。
循环条件中定义的类型为unsigned int,该类型为无符号整型,无负数形式。即for循环永远成立。
/* (1) */ int c = a; a = b; b = c; /* (2) */ a = a - b; b = b + a; a = b - a; /* (3) */ a ^= b ; b ^= a ; a ^= b;
(1)通过用中间变量来交换值
(2)利用a与b的差值进行计算,实现交换
(3) 用异或运算将a与b相应位若相同记为0,不同记为1,其值传给a。再将b与a进行异或运算实现b到a的转变,最后用a与b进行异或运算实现a到b的转换。
void f() { static int a = 0; int b = 0; printf("%d, %d\n", ++a, ++b); }
输出为:1, 1
多次执行,b的值不变,而a的值一直递增。
使用static修饰符定义静态局部变量,它的生命周期是整个应用程序的运行时间,它只会被初始化一次。
int main(void) { printf("%d\n", printf("Xiyou Linux Group2%d", printf(""))); }
Xiyou Linux Group2019
printf的嵌套使用的顺序为:从内向外,从左向右执行。并且该函数的返回值为打印的字符数量,故内层的printf函数中%d输出为0,外层的printf函数中%d输出为19。
int main(int argc, char *argv[]) { char ch = 255; int d = a + 1; printf("%d %d", ch, d); }
由于未声明a,编译器会报错。若忽略a,则输出ch的值为-1。
char占一个字节,其范围是-128~127。255用二进制表示为 1111 1111。因为它是有符号类型,则最前面的1被当作符号位,输出即为-1.
int main(int argc, char *argv[]) { char x = -2, y = 3; char t = (++x) | (y++); printf("x = %d, y = %d, t = %d\n", x, y, t); t = (++x) || (y++); printf("x = %d, y = %d, t = %d\n", x, y, t); }
x = -1, y = 4, t = -1
x = 0, y = 5, t = 1
“|”是或运算,++i为先自加,后使用。i++则相反。故
t= 1111 1111 | 0000 0011 = 1111 1111
“||”是“或”。(a)||(b)若a判断为真则不继续判断b的真假,返回为真(即1)。题中 ++x=0 则继续判断y++,同时在做完判断之后使y自加。
#define X a+b int main(int argc, char *argv[]) { int a = 1, b = 1; printf("%d\n", X*X); }
3
C的宏预处理器的工作只是简单的文本搜索和替换,即将代码中的 X*X 替换为 a+b*a+b ,而不是(a+b)*(a+b)。为防止此类错误发生,可以将宏这样定义:#define X (a+b)
int val = 2018; int *pi = 2019; pi = &val; *pi = 0;
第一句:声明一个int类型的变量val,并将2018赋值给val。
第二句:声明一个指向int类型的指针,并使该指针指向2019(0x07E3)处。(这样做有风险)
第三句:将val的地址赋值给指针pi。
第四句:将pi所指的地址里的数据修改为0。
int main(int argc, char *argv[]) { char *p = (char *)malloc(sizeof(char) * 20), *q = p; scanf("%s %s", p, q); printf("%s %s\n", p, q); }
Linux Linux
p指向所分配空间的地址,并且声明指针变量q,使其指向p所指的空间。即p,q指向同一个空间。
scanf("%s %s",p,q)在输入Xiyou (以空格结束第一个%s)后改变*p的值,输入Linux (回车)后改变*q的值(其实改变的是同一个地址中的数据),后输入的Linux 覆盖了之前输入的Xiyou,故输出为两个Linux。
int main(int argc, char *argv[]) { int a[4] = { 2, 0, 1, 9 }; printf("%p, %p\n", a, &a); printf("%p, %p\n", a + 1, &a + 1); }
0x7ffd2ec76b00, 0x7ffd2ec76b00
0x7ffd2ec76b04, 0x7ffd2ec76b10(本机第一次)
0x7ffe0c0da930, 0x7ffe0c0da930
0x7ffe0c0da934, 0x7ffe0c0da940(本机第二次)
每次执行输出结果不一致
由于每次执行该程序时,给a分配的内存是动态的,故a的地址一直在变化。
#include<stdio.h> int f(int n) { if (n <= 2) return 1;//当n=1,2时返回值为1,即f(0)=f(1)=f(2)=1 else return f(n - 1) + f(n - 2);//此时n>2,返回前两个数之和 } int main() { int n = 0; scanf("%d", &n); printf("%d\n", f(n)); return 0; }
int main(int argc, char *argv[]) { 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] > nums[j]) { int c = nums[i]; nums[i] = nums[j]; nums[j] = c; } } } }
选择排序。
原理:逐一与后面数字比较,若该数字大于后面另一个数字,则交换。实现了一次循环将最小值放在第一位。第二次循环实现将第二小的数字放在第二位,以此类推。
优化如下:
int main(){ int len=sizeof(a)/sizeof(int); int t; /*初始化左端、右端元素下标*/ int left = 0; int right = len - 1; while (left < right){ /*初始化最小值、最大值元素的下标*/ int min = left; int max = right; for (int i = left; i <= right; i++){ /*标记每趟比较中最大值和最小值的元素对应的下标min、max*/ if (a[i] < a[min]) min = i; if (a[i] > a[max]) max = i; } /*最大值放在最右端*/ int t = a[max]; a[max] = a[right]; a[right] = t; /*此处是先排最大值的位置,所以得考虑最小值(a[min])在最大位置(right)的情况*/ if (min == right) min = max; /*最小值放在最左端*/ t = a[min]; a[min] = a[left]; a[left] = t; /*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/ left++; right--; } }
大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中(高位在前)
小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高地址中(低位在前)
#include <stdio.h> int Check() { union Un { char c; int i; }un; un.i = 1; return un.c; } int main() { int c=Check(); if (1 == c) { printf("当前模式为小端存储\n"); } else { printf("当前模式为大端存储\n"); } return 0; }
#include<stdio.h> int Check() { int i = 1; return (*((char*)&i)); //返回1表示小端 //返回0表示大端 } int main() { int c = Check(); if (1 == c) { printf("小端\n"); } else { printf("小端\n"); } return 0; }
[root@xiyoulinux /]# ls -al total 36 drwxr-xr-x 17 root root 4096 Sep 21 23:45 . drwxr-xr-x 17 root root 4096 Sep 21 23:45 .. lrwxrwxrwx 1 root root 7 Aug 21 22:21 bin -> usr/bin drwxr-xr-x 4 root root 2048 Jan 1 1970 boot drwxr-xr-x 21 root root 3580 Nov 21 21:16 dev drwxr-xr-x 83 root root 4096 Nov 21 22:12 etc drwxr-xr-x 4 root root 4096 Sep 22 00:07 home drwxr-xr-x 2 root root 4096 Aug 21 22:21 mnt drwxr-x--- 9 root root 4096 Nov 19 19:15 root dr-xr-xr-x 13 root root 0 Nov 21 21:15 sys drwxrwxrwt 10 root root 380 Nov 21 22:30 tmp drwxr-xr-x 9 root root 4096 Nov 21 22:12 usr
该命令显示出指定目录下的内容(包括当前目录中文件及其子目录)。
-al 指查看设备是否具有读写权限。
第一列表示文件类型及权限
第二列表示链接数
第三列表示该文件所有者
第四列表示该文件所属群组
第五列表示文件大小(字节)
后面三列是该文件的最后修改时间
最后一列是文件名称