变量 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。
我们在遇到复合赋值语句时是右结合性即从右到左算
不知道你这个问题是否已经解决, 如果还没有解决的话:分析:
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;
}
答案:
首先,根据运算符的优先级,先进行乘除法运算,再进行加减法运算。
int x=10,y=5,z=2; int res=x+y-z*2/(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;
}