#include<stdio.h>
int i=0;// i=1~5是<
int main(int argc,char*argv[])
{
i--;
if(i>sizeof(i))
printf(">\n");
else
printf("<\n");
return 0;
}//输出">"
sizeof的返回值类型是一个size_t型,size_t(typedef unsigned int size_t),它是一个unsigned int型。
而x 是 int 类型,比较时会将 x 变为 unsigned int类型,而 -1 变为 unsigned 类型是一个很大的整
数,所以是大于。
#include<stdio.h>
#define A 2+2
#define B 3+3
#define C A*B
int main(int argc,char*argv[])
{
printf("%d\n",C);
return 0;
}
/*直接替换为C=A+B=2+2*3+3=11*/
宏:http://C语言宏定义、宏函数、内置宏与常用宏_Apollon_krj的博客-CSDN博客
#include<stdio.h>
int main(int argc,char*argv[])
{
char str[]="welcome to xiyoulinuxgroup";
printf("%zu %zu\n",strlen(str),sizeof(str));//26 27
return 0;
}
%zu输出size_t型。size_t在库中定义为unsigned int。
如果%zu不能使用,可以用%u取代。但%zu不能输出负数。
关于sizeof,strlen:https://blog.csdn.net/niushuai666/article/details/7677210
#include<stdio.h>
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);//static静态局部变量在函数结束后仍保留值用于下一次运算
}
int main(int argc,char*argv[])
{
fun();fun();fun();fun();
return 0;
}
结果如下:
#include<stdio.h>
int main(int argc,char*argv[])
{
int number;
unsigned mask;
mask=1u<<31;//将1转换为unsigned int类型再将其32位二进制码向左移31位
scanf("%d",&number);
while(mask)
{
printf("%d",(number&mask)?1:0);//转换为32位的二进制数(numberh和mask此为都不为0则转为1,有一个为0则是0)
mask>>=1;//mask二进制数向右移一位一直到高位全部补为0退出
}
return 0;
}
/* 移位操作都是针对补码进行的*/
结果如下(输出32位十六进制数):
(<<左移运算符)
左移运算符是用来将一个数的各二进制位全部左移若干位,右补0。高位左移后溢出,舍弃。
例如:
将a的二进制数左移2位,右补0。若a=15,即二进制数00001111,左移2位得00111100,即十进制数60。
3 << 2,则是将数字3左移2位。即00000011----->00001100(12);
(>>右移运算符)
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃)。高位的空位补符号位,即正数补零,负数补1。
例如:
11 >> 2,则是将数字11右移2位,即00001011------>00000010(2);
#include<stdio.h>
int main(int argc,char*argv[])
{
char *str="xiyou linux group";
printf("%c\n",*(str+2));//改变优先级则可以先移动到y的地址再取值
printf("%c\n",*str+1);//先取到x(*str)后加1得到字母顺序表的后一个字母y
return 0;
}//结果都是y
#include<stdio.h>
int main(int argc,char*argv[])
{
double a=3.14;
float b=a;//取a的float范围赋值给b(有精度的缺失)
if((float)a==b)//a暂时被强制转换为了float类型与b相同
{
printf("xiyou ");
}
if(a!=b)//两个不同类型的数不相等(必须在用一个精度内进行比较相等)
{
printf("linuxgroup\n");
}
return 0;
}//xiyou linuxgroup
#include<stdio.h>
int main(int argc,char*argv[])
{
int a[6]={0x6f796958,0x694c2075,0x2078756e,0x756f7247,0x30322070,0};
printf("%d\n",printf("%s",(char*)a));
return 0;
/*按输出:0x58 0x69 0x79 0x6f 0x75 0x20 0x4c 0x69 0x6e 0x75 0x78 0x20 0x47 0x72 0x6f 0x75 0x70 0x20 0x32 0x30 0x32 0x30*/
/*按题目:0x58 0x69 0x79 0x6f 0x75 0x20 0x4c 0x69 0x6e 0x75 0x78 0x20 0x47 0x72 0x6f 0x75 0x70 0x20 0x32 0x30 0x32 0x30*/
/*eg:空格(ASCII:32->(20)十六进制)小端表示法*/
}//Xiyou Linux Group 2020
大小端:字节序:大端法和小端法 - Broglie - 博客园
#include<stdio.h>
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]);//2 0
printf("%d %d\n",c[1][1],d[1][1]);//2 0
return 0;
}
#include<stdio.h>
int main(int argc,char*argv[])
{
int a=1;
printf("%d\n",*(char*)&a);//对a取地址得到1的地址并且转换为指针变量,再取此指针指向的地址就是a,得到a=1*/
return 0;
}//1
#include<stdio.h>
int main(int argc,char*argv[])
{
const char a[]="xiyoulinux\0";
char*b="xiyoulinux\0";
/*a[5]='\0';错误,不能对只读常量赋值*/
/*b[5]='\0';错误,不能通过指针对数组b进行赋值(段错误,找不到内存)*/
printf("%s\n",a);
printf("%s\n",b);
return 0;
}
详细内容: http://谈谈C语言从源文件变为可执行文件之间发生的过程详解(C程序的编译链接运行)_呋喃吖的博客-CSDN博客
改进冒泡排序(加入一个判断量change):
#include<stdio.h>
int main()
{
int s[1001];
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)则说明已经有序则提前退出排序
{
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;//若发生了交换,change置为1
}
}
}
printf("%lf seconds\n", Times);
for (i = 0; i < n; i++)
printf("%d ", s[i]);
}
/*通过相邻数据的交换逐步将待排序序列变成有序序列的过程(也叫相邻排序)*/
第二种优化双向排序(也叫鸡尾酒排序)
下列出代码核心部分:
lenght = sizeof(a)/sizeof(int);
lenght = sizeof(a)/sizeof(a[0]);//先计算总长度
right = lenght-1;
left = 0;
//先给右边的赋值,因为右边的先排出数组里面的最大值 ,外层先装一个代表right的for循环吧
while(right>left)
{
//下面的两个for循环是平等关系的,用一个while循环把她们括起来
for(i=left;i<right;i++)
{
temp = 0;
//第一个for循环里面的交替是进行左边的值比较与交换,就是针对左边的较大数字排序
if(a[i]>a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
right--;//这样满足下一次摆放的那个数是放在右边的倒数第二个位置上面
temp = 0;
for(j=right;j>left;j--)
{
//内部的for循环是进行右边的数字大小排序,就是把比较小的数字放在右边的位置。
if(a[j]<a[j-1])
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
left++;//这样满足下一次左边放着第二大的数字是再左边第二个位置上面
}
其他排序法:总结排序方法(未完)_TGRD4的博客-CSDN博客
(1)/(2):查看目录/文件
ls 查看当前目录下的所有目录和文件
ls -a 查看当前目录下的所有目录和文件(包括隐藏的文件)
ls -l 或 ll 列表查看当前目录下的所有目录和文件(列表查看,显示更多信息)
ls /dir 查看指定目录下的所有目录和文件 如:ls /usr
前两个命令:(绿标为当前操作文件)
补充:
绿色---->代表可执行文件
红色---->代表压缩文件
深蓝色---->代表目录
浅蓝色----->代表链接文件
灰色---->代表其它的一些文件
第三个命令:(两个效果一样)
最后一个命令:
也可以直接通过文件管理器复制文件路径,粘贴在ls后面。
双杠线和单杠线都可以使用,下列输出一致:
(3):创建目录
mkdir aaa 在当前目录下创建一个名为aaa的目录
mkdir /usr/aaa 在指定目录下创建一个名为aaa的目录
目录切换
命令:cd 目录
cd / 切换到根目录
cd /usr 切换到根目录下的usr目录
cd ../ 切换到上一级目录 或者 cd ..
cd ~ 切换到home目录
cd - 切换到上次访问的目录
新建文件
命令:touch 文件名
示例:在当前目录创建一个名为aa.txt的文件 touch aa.txt
运行如下:(在myworld目录下创建了一个ok目录显示后切换到ok目录,在ok目录下创建了一个新文件txt1.txt并将其显示,最后再切换回原目录)
(4):拷贝目录
命令:cp -r 目录名称 目录拷贝的目标位置 -r代表递归
示例:将/usr/tmp目录下的aaa目录复制到 /usr目录下面 cp /usr/tmp/aaa /usr
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不用写-r递归
此时ok目录中存在一个txt1.txt文本文件需要拷贝到另一个目录myworld中(操作如下):
此时指定查看两个目录下的文件:
txt1.txt已被成功复制
如果需要复制的是空文件也可以直接使用mkdir在目标目录下创建一个新文件。