萌新的c语言学习4
题目1 冒泡排序法
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int a = 0;
int temp = 0;
int j = 0;
for (j = 0; j < sz - 1-i; j++)
{
if (arr[j] > arr[j+1])
{
a = arr[j];
arr[j] = arr[j + 1];
arr[j+1] = a;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
///想要排成升序的效果
bubble_sort(arr,sz);///冒泡排序函数
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}
题目2 不创建临时变量交换数字
法1
int main()
{
int a = 10;
int b = 20;
a = a ^b;
b = a ^b;
a = a ^b;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
法2
int main()
{
int a = 10;
int b = 20;
a = a + b;///用加减法可能会溢出
b = a - b;
a = a- b;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
题目3 求一个二进制数字中1有几个
///求一个正整数存储在内存中的二进制中1的个数
int main()
{
int a = 0;
int count = 0;
printf("请输入一个正整数:");
scanf("%d", &a);
while (a != 0)
{
if (a % 2 == 1)
{
count++;
}
a = a / 2;
}
printf("count结果是:%d\n", count);
return 0;
}
上述做法只适合求正整数遇到负数就不好操作了
//从数字自己的本身出发
//比如说00000011最低位与00001进行比较得出来的结果是1
//然后再移位每一次都与1进行比较
int main()
{
int num = 0;
int count = 0;
int i = 0;
printf("请输入数字:");
scanf("%d", &num);
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1))
{
count++;
}
}
printf("%d", count);
return 0;
}
题目4 计算题组合训练
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//
printf("%d\n", i);//0
//逻辑0 因为 a第一个算完为0 之后就不会再算了
printf("%d\n %d\n %d\n %d\n " ,a, b, c, d);//1,2 3 4
return 0;
}
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//
printf("%d\n", i);//1
//逻辑0 因为 a第一个算完为0 之后就不会再算了
printf("%d\n %d\n %d\n %d\n ", a, b, c, d);//2,3,3,5
return 0;
}
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;//
printf("%d\n", i);//1
// 逻辑或和逻辑与一样遇到一个1之后就不会再进行后续操作
printf("%d\n %d\n %d\n %d\n ", a, b, c, d);//1,3,3,4
return 0;
}
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d", c);//逗号表达式会从左向右算,结果是最后一个结果 13
return 0;
}
题目5 对地址sizeof的探究
int main()
{
int a = 0;
char b = 'w';
int arr[10] = { 0 };
char arr1[] = "abc";
short s = 0;
int c = 10;
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(b));//1
printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof(arr));//40
//对于数组arr,也可以写成 int [10]的形式
printf("%d\n", sizeof(int [10]));//40
printf("%d\n", sizeof(int [1]));//4
printf("%d\n", sizeof(int [5]));//20
printf("%d\n", sizeof(arr1 ));//4包括了\0
printf("%d\n", sizeof(s=5+c ));//2
printf("%d\n", sizeof(s ));//2
printf("%d\n", sizeof(short ));//2
printf("%d\n", s);//0 被骗了上面sizeof并不会计算 里面没变还是0
return 0;
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//40
printf("%d\n", sizeof(ch));//40
test1(arr);//8
test2(ch);//8
//数组传参,传的是数组首位地址,最好用指针接受
//我电脑是64位所以是8字节 1字节是8比特
return 0;
}
隐式类型转换
c语言中的整型算术运算总是以缺省整型类型的精度来进行计算的
int main()
{
//偷偷发生的隐式转化
char a = 3;
a只能放一个字节,这样就会发生截断
//0000 0011
char b = 127;
//0111 1111
char c = a + b;//直观感受觉得是130
//a与b如何相加
// a是3 0000 0011 char是有符号的数字发生整型提升变成
// 000000000000000000000000000 0000 0011(前面的0我随手写的,只是表示提升这种效果)
// 000000000000000000000000000 0111 1111 b
// 000000000000000000000000000 1000 0010 c
// 我们是补码运算的把c这个码转换成本身
// 就是-126
//
// 1000 0010正常结果130
//
printf("%d", c);//结果是-126
return 0;
}
c语言在实际情况过程中都会进行整型提升
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
{
printf("a");
}
else if (b == 0xb600)
{
printf("b");
}
else if (c == 0xb6000000)
{
printf("c");
}
return 0;
}//这一题只会输出c
int main()
{
char c = 1;
printf("%u\n", sizeof(c));//1
printf("%u\n", sizeof(+c));//4,我要对他进行计算,一旦计算那就是整形大小就是4个字节
printf("%u\n", sizeof(!c));//1
return 0;
}
整型提升是广泛存在的,只要你进行操作的数大小并未达到整型都会发生整型提升