C语言的运算相关的题

img


可以帮我解答一下吗?谢谢啦,尽量详细一点哦,对这个掌握不太好

变量 j 被初始化为 5,按照左结合规则,j += j -= j * j 可以拆分成以下两个步骤:j -= j * j和j += j:
计算 j * j,记为 r1,此时 r1 = j * j = 25;
执行 j -= r1,即 j = j - r1,此时 j = 5 - 25 = -20;
执行 j += j,即 j = j + j,此时 j = -20 + (-20) = -40。
因此,最终结果是 -40。

我们在遇到复合赋值语句时是右结合性即从右到左算

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7517806
  • 你也可以参考下这篇文章:【C语言】二分查找。给定一个有序的数列,查找指定的数值。如果查询到该数值,则返回该数值在数组中的位置。
  • 除此之外, 这篇博客: [ C语言 ] 还不懂指针的一定要进来,带你初始指针,简单使用指针,它没有你想的那么难。中的 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    分析:

    int main()
    {
    	float a[5];
    	float* p;
    	for (p = &a[5]; p >= &a[0];)
    	{
    		*--p = 0;
    	}
    	return 0;
    }

     

    改进:

    	for (p = &a[4]; p >= &a[0]; p--)
    	{
    		*p = 0;
    	}

     

    标准规定:
    允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
    指向第一个元素之前的那个内存位置的指针进行比较。

     

     指针 -- 地址
     数组 -- 一组相同类型的数据
    int main()
    {
    	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    	//arr首元素地址
    	int* p = arr;
    	int i = 0;
    	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    	{
    		printf("%p == %p \n", p + i,&arr[i]);
    	}
    
    
    	return 0;
    }

    分析:

     

    可见数组名和数组首元素的地址是一样的。
    结论:数组名表示的是数组首元素的地址
    那么这样写代码是可行的:
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int *p = arr;//p存放的是数组首元素的地址
    既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
    	int* p = arr; //指针存放数组首元素的地址
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
    	}
    	return 0;
    }

     所以 p+i 其实计算的是数组 arr 下标为i的地址

    指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
    这就是 二级指针
    int main()
    {
    	int a = 10;
    	int* pa = &a;
    	int** ppa = &pa; //ppa就是一个二级指针
    	**ppa = 20;
    	printf("%d\n",a);
    
    	return 0;
    }

  • 您还可以看一下 张传波老师的软件设计是怎样炼成的?课程中的 架构设计的第一层拆解小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    答案:

    首先,根据运算符的优先级,先进行乘除法运算,再进行加减法运算。

    int x=10,y=5,z=2; int res=x+y-z*2/(y+z);

    1. z*2 运算结果为 4
    2. y+z 运算结果为 7
    3. 2/(y+z) 运算结果为 0,因为 2 除以任何大于等于 2 的数结果都小于 1,而且在 C 语言中整数相除会直接求整数部分,即默认舍去小数部分
    4. z*2/(y+z) 运算结果为 0,因为此处进行了整数相除运算
    5. x+y-z2/(y+z) 运算结果为 15,因为前面已经得到 z2/(y+z) 的值为 0,故此处的运算相当于 x+y-z

    因此,res 的值为 15。

    代码实现如下:

    #include <stdio.h>
    
    int main() {
       int x=10,y=5,z=2;
       int res=x+y-z*2/(y+z);
       printf("res = %d\n", res);
       return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^