int i; int main(int argc,char *argv[]){ i--; if(i>sizeof(i)){ printf(">\n"); }else{ printf("<\n"); } return 0; }
>
未初始化的全局变量全部默认值为0,而i--后i的值为-1,二进制表示为
1111 1111 1111 1111 1111 1111 1111 1111
而sizeof的结果为4,二进制表示为
0000 0000 0000 0000 0000 0000 0000 0100
显然在比较中将i当作了无符号整型来与sizeof(i)比较的,所以结果为>
#define A 2 + 2 #define B 3 + 3 #define C A *B int main(int argc, char *argv[]) { printf("%d\n", C); return 0; }
11
宏进行的是简单的文本替换,题中A*B的替换结果其实是2+2*3+3
int main(int argc, char *argv[]) { char str[] = "Welcome to XiyouLinuxGroup"; printf("%zu %zu\n", strlen(str), sizeof(str)); return 0; }
26 27
%zu输出size_t型,size_t在库中定义为unsigned int 。
strlen计算的是字符串的元素个数(不包括结尾的"\0")
而sizeof计算的是其占内存的大小,结尾"\0"也占一字节,所以结果为27。
void fun() { int x = 0; static int num = 0; for (int i = 0; i < 5; i++) { x++; num++; } printf("x = %d num = %d\n", x, num); }
x = 5 num = 5
x = 5 num = 10
x输出结果相同,num的不同。
使用static修饰符定义静态局部变量,它的生命周期是整个应用程序的运行时间,它只会被初始化一次。每次调用fun()都会在num原有的基础上再加5,而x每次都是从0加到5
int main(int argc, char *argv[]) { int number; unsigned mask; mask = 1u << 31; scanf("%d", &number); while (mask) { printf("%d", (number & mask) ? 1 : 0); mask >>= 1; } return 0; }
首先,1u的作用是表示1是unsigned int类型的,<<是左移,
如char a=1,a的二进制为0000 0001,执行a<<3后a的值为8,其二进制数为0000 1000,低位补0。
&是且运算,对应二进制位都为1时该位的结果为1,否则为0。
如a=3,b=7,a&b=2(0011 & 1110 = 0010)
同理mask>>=1是向右移动一位,高位补0。
"?:"是双目运算符,?前面的返回值不为零则返回?与:中间的值,否则返回:后面的值
int main(int argc, char *argv[]) { char *str = "Xiyou Linux Group"; printf("%c\n", *str + 1); return 0; }
X的地址为该字符串的首地址,则*str='X',而'X'+1='Y'(ASCII码的加减)
int main(int argc, char *argv[]) { double a = 3.14; float b = a; if ((float)a == b) { printf("Xiyou"); } if (a != b) { printf("LinuxGroup\n"); } return 0; }
XiyouLinuxGroup
整数在转换成浮点数时精度有损失,float只能保证最少6位数字有效,而double只能保证最少15位数字有效。所以a!=b。当a强制转换为float时,a==b。
int main(int argc, char *argv[]) { int a[6] = {0x6f796958, 0x694c2075, 0x2078756e, 0x756f7247, 0x30322070, 0}; printf("%d\n", printf("%s", (char *)a)); return 0; }
家用计算机一般都为小端机,即低位在前。例如题中:0x6f796958 在计算机中“58”在前,“69”在后。先输出十六进制数“58”所对应的字符,后输出十六进制数“69”所对应的字符。
int main(int argc, char *argv[]) { int a[2][3] = {{5, 7}, {5, 2}}; int b[2][3] = {5, 7, 5, 2}; int c[2][2] = {{5, 7}, {5, 2}}; int d[2][2] = {5, 7, 5}; printf("%d %d\n", a[1][1], b[1][1]); printf("%d %d\n", c[1][1], d[1][1]); return 0; }
2 0
2 0
int a[2][3] = {{5, 7}, {5, 2}};//相当于:{{5,7,0},{5,2,0}} int b[2][3] = {5, 7, 5, 2};//按顺序初始化,相当于{{5,7,5},{2,0,0}} int c[2][2] = {{5, 7}, {5, 2}}; int d[2][2] = {5, 7, 5};//同b
int main(int argc, char *argv[]) { int a = 1; printf("%d\n", *(char *)&a); }
1
*(char *)&a是将a的指针改为char类型指针,再取值运算后a实际的值并未变化。
int main(int argc, char *argv[]) { /*const*/ char a[] = "XiyouLinux\0"; char *b = "XiyouLinux\0"; a[5] = '\0'; // b[5] = '\0'; printf("%s\n", a); // printf("%s\n",b); return 0; }
1)不能被修改
2)不能正常运行
const修饰的数组,其中任何元素都不能被改变。
不能通过指针对数组b进行赋值
1、预处理
在预处理阶段,编译器主要作加载头文件、宏替换、条件编译的作用。一般处理带“#”的语句。
2、编译
在编译过程中,编译器主要作语法检查和词法分析。我们可以通过使用 -S 选项来进行查看,该选项预处理之后的结果翻译成汇编代码。
3、汇编
在汇编过程中,编译器把汇编代码转化为机器代码。
4、链接
链接就是将目标文件、启动代码、库文件链接成可执行文件的过程,这个文件可被加载或拷贝到存储器执行。
void sort(int arr[], int size) { int i, j, tmp; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - i - 1; j++) { if (arr[j] > arr[j + 1]) { tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } }
冒泡排序,依次比较数组内相邻两数,按升序或降序交换两数。
优化:
void sort(int arr[], int size) { int flag = 1; int count = 0; int i,j,temp; for(i=0;i<size-1&&flag;i++) { for(j=0;j<size-1;j++) { flag = 0; count++; if(arr[j]>arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; flag = 1; } } } }
pwd (显示目前所在的目录)
ls : 列出目录及文件名,-a 全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来
mkdir(创建新目录):
mkdir [-mp] 目录名称cp 即拷贝文件和目录。
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)