c语言程序设计与实验指导

img

img


谁能帮我解释一下这两题的答案的由来啊
第一题答案是10 41 70
第二题的网上的答案是
2
7 3
我们lao shi跟我们说是
2
5 5

第一题

  • p++->x 是 后自增,先获取x 再++,也就是 a[0].x = 10
  • ++p->y 先获得y 再++获取到的值,由于之前p移动了一个位置,现在 a[1].y = 40 ++ 为41
  • (a+3)->x 等于a[3].x = 70

第二题

  • 首先for 循环创建数组s 第一个元素依次为 1 3 5 7 ,第二个元素依次为 前一个元素的地址,p 为 s[0]地址
  • ++*p->b 首先获取 b 的值,即a 的地址,解引用 即为 a 也就是 1 然后 ++ 为2
  • p自增后 指向 s[1]
  • (++p)->a 前自增 先自增后指向s[2],后获取值为 5
  • (p++)->a 先获取值 目前还是指向 s[2] 为 5, 后自增

如果有用麻烦点个采纳 谢谢~

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/714327
  • 你也可以参考下这篇文章:指针与二维数组练习-计算矩阵边缘元素之和(C程序设计进阶 第5周)
  • 除此之外, 这篇博客: C语言基础05——操作符与表达式求值。整型提升、二进制中1的个数、不使用中间值交换两个变量中的 算数转换(自动类型转换) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 如果两个不同类型的数就行运算,那么其中一个操作数就要转换为另一个操作数的类型,否则无法进行运算。这种转换就称为寻常算数转换。一般会自动转换为表达数字范围较大的类型。

    //类型精度从高到低:
    long double > double > float > unsigned long int > long int > unsigned int > int > short  > char 
        
    //如果某个操作数的类型在上面中排名较低,那么就要首先转换为另一个操作数的类型后,才能进行运算。
    
    //注意:算数转换也需要合理,否则会出现问题。
    //如:
    float f = 3.14;
    int num = f; //隐式转换,会有精度丢失
    
    //对于printf来说,任何小于int的类型会被转换为int,float会被转换为double
    //但是scanf不会,要输入short,格式说明符应该为%hd