1.运行下面的代码,输出结果是什么,请解释说明。
int i;
int main(int argc, char *argv[])
{
i--;
if (i > sizeof(i))
{
printf(">n");
}
else
{
printf("
结果为:>
全局变量i未初始化,默认为0,i–变成-1,sizeof(int)的结果为无符号整数4,i为有符号整数-1。
有符号整数和无符号整数比较时,有符号整数会按无符号整数来处理。
-1的补码为11111111 11111111 11111111 11111111,按无符号整数来看为4294967297,显然大于4,所以输出为 >。
2.有关宏,略
3.sizeof和strlen,略
4.函数中的静态局部变量,略
5.分析以下程序,推测并验证其作用。
#include
int main(int argc,char*argv[])
{
int number;
unsigned mask;
mask=1u<<31;//结果mask为2的31次幂,二进制补码为1000....(31个0)
scanf("%d",&number);
while(mask)
{
printf("%d",(number&mask)?1:0);//第一次循环中判断number的二进制形式的最高位(最左边),是0打印0,是1打印1
mask>>=1;//第一轮循环mask变为01000....(30个0)
}
return 0;
}
移位运算符>>和<<,以及其它按位运算符,略,转载:
六种位运算符_朝闻道_的博客-CSDN博客_位运算符
作用是打印输入的number的二进制补码。
6.字符数组和指针运算,略
7.以下程序段的运行结果是什么,你知道怎么判断两个浮点数是否相同吗?
#include
int main(int argc,char*argv[])
{
double a=3.14;
float b=a;
if((float)a==b)
{
printf("xiyou ");
}
if(a!=b)
{
printf("linuxgroupn");
}
return 0;
}
计算机并不能准确的表达浮点数,只能表达一定精度的近似.(有关double和float表示浮点数的精度)
本题中,在执行完a = 3.14;这一条语句后,a的值实际上为3.1400000000000001(本机),但是在精度要求不是很高时,近似表示3.14。执行完float b=a;这一条语句后,a被强制类型转换为float类型,b的值实际为3.1400001(本机)。
因此,(foat)a的结果也为3.1400001,等于b,打印 Xiyou ,而a和b实际上并不相等,打印linuxgroup。
转载:
如何判断两个浮点数是否相等_yyyyeahhhhhh的博客-CSDN博客_如何判断两个浮点数是否相等
8.运行下列代码,解释运行结果并谈谈自己的理解。
#include
int main(int argc,char*argv[])
{
int a[6]={0x6f796958,0x694c2075,0x2078756e,0x756f7247,0x30322070,0};
printf("%dn",printf("%s",(char*)a));
return 0;
}
输出为:
Xiyou Linux Group 2020 (并且光标换行)
涉及数组元素的存储和字节序,大小端等知识。
大端法与小端法_u012861978的专栏-CSDN博客_小端法
本题为小端法存储,所以该数组在内存中由低地址端到高地址端存储为:
0x58 0x69 0x79 0x6f 0x75 0x20 0x4c 0x69 0x6e 0x75 0x78 0x20 0x47 0x72 0x6f 0x75 0x70 0x20 0x32 0x30 0x32 0x30 0x0
由于数组名就是数组首元素的地址,所以(char*)a即为指向数组首元0x58的指针,并且把0x58视为char类型。综上,按照转换说明%s进行打印,会依次打印0x58 0x69 0x79 0x6f.....对在ANSII表中对应的字符,最终打印:Xiyou Linux Group 2020,并让光标换行。
9.二维数组初始化:
int a[2][3]={{5,7},{5,2}};按照给定格式进行元素分配,空余位置补0.
int b[2][3]={5,7,5,2};按照顺序分配,一行满了再换下一行,剩下位置补0.
10.指针运算相关:
int a = 1;
*(char*)&a;
对a取地址得到1的地址,并转换为指向char类型变量的指针,再取此指针指向的地址就是a的第一个字节,取出来为1.
11.下面程序段的输出结果是什么,若取消第三行的const注释,a数组还能被修改吗?如果取
消第6、8行的注释,程序还能正常运行吗,试着解释其原因。
int main(int argc, char *argv[])
{
char a[] = "XiyouLinux ";
char *b = "XiyouLinux ";
a[5] = ' ';
// b[5] = ' ';
printf("%sn", a);
// printf("%sn",b);
return 0;
}
const后不能被修改。
char *b = "XiyouLinux ";
这句话是说,b是一个指针,初始化为指向一个字符串常量。但由于这个常量所在的地方(地址较小),所以实际上b是一个const char *b,是不可以被修改的。但由于历史原因,编译器接受不带const的写法,但是试图对b所指的字符串做写入会导致严重的后果。
总之,char *b = "XiyouLinux ";此类字符串是不可以修改的,想修改,应该用数组。
详细内容见转载:
谈谈C语言从源文件变为可执行文件之间发生的过程详解(C程序的编译链接运行)_呋喃吖的博客-CSDN博客_c文件编译可执行文件
冒泡排序(由小到大),改进如下(加入一个判断量change):
#include
int main()
{
int s[100];
int i, j, n, t;
int change=1;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &s[i]);
for (i = 0; i < n&&change; i++)
{
change=0;
for (j = 0; j < n - i - 1; j++)
{
if (s[j] > s[j + 1])
{
t = s[j];
s[j] = s[j + 1];
s[j + 1] = t;
change=1;
}
}
printf("%lf secondsn", Times);
for (i = 0; i < n; i++)
printf("%d ", s[i]);
}
(1)(2):
命令:ls [-al]
ls 查看当前目录下的所有目录和文件
ls -a 查看当前目录下的所有目录和文件(包括隐藏的文件)
ls -l 或 ll 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls /dir 查看指定目录下的所有目录和文件 如:ls /usr
(3):touch 1.c
(4):三、拷贝目录
命令:cp -r 目录名称 目录拷贝的目标位置 -r代表递归
示例:将/usr/tmp目录下的aaa目录复制到 /usr目录下面 cp /usr/tmp/aaa /usr
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归
转载自:Linux常用命令_Demon的博客-CSDN博客_linux常用命令



