【【萌新的c语言学习4】】

萌新的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;
}

整型提升是广泛存在的,只要你进行操作的数大小并未达到整型都会发生整型提升

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值