7 以下程序段运行的结果是什么,你知道怎么判断两个浮点数是否相同?
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。
8 运行下列代码,解释运行结果,谈谈自己的理解。
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”所对应的字符。
9分析下列程序的输出,解释其原因
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
10执行下面程序段,其输出结果是什么,解释其原因。
int main(int argc, char *argv[]) { int a = 1; printf("%d\n", *(char *)&a); }
1 *(char *)&a是将a的指针改为char类型指针,再取值运算后a实际的值并未变化。
11 下面程序段的输出结果是什么,若取消第三行的const注释,数组a还能被修改吗?取消6,8行的注释,程序还能正常运行吗?解释其原因
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修饰的数组,其中任何元素都不能被改变。 字符指针是常量字符串,不能被修改。
12一个c源文件到一个可执行文件的过程中经历了那些步骤?
1、预处理 在预处理阶段,编译器主要作加载头文件、宏替换、条件编译的作用。一般处理带“#”的语句。 2、编译 在编译过程中,编译器主要作语法检查和词法分析。我们可以通过使用 -S 选项来进行查看, 该选项预处理之后的结果翻译成汇编代码。 3、汇编 在汇编过程中,编译器把汇编代码转化为机器代码。 4、链接 链接就是将目标文件、启动代码、库文件链接成可执行文件的过程,这个文件可被加载或拷贝到存储器执行。