4,8,
4,8,
main中的a是全局变量a,函数中a+=( * p)++,先执行a=a+(*p),这里a是静态变量a,第一次sub(&a)后,a=1+3 = 4,然后p指向的值加1,也就是全局变量a的值加1,变为4。第二次sub(&a)后,a = 4 + 4 = 8,然后全局变量a加1后为5。输出的都是静态变量a的值,所以是4,8,
分别打印的是4和8
具体分析如下:
第一次打印,内部a=1,p=3,a+=(p)++之后的a的值为4,执行后p的值为4;
第二次打印,内部a=4,p=4,a+=(p)++之后的a的值为8,执行后p的值为5;
因此第一次打印4,第二次打印8
4,8
很简单的问题
这个程序定义了一个全局变量a,值为3。然后定义了一个函数sub,它接受一个指向整数的指针作为参数。函数内部定义了一个静态局部变量a,初始值为1。函数内部对静态局部变量a进行了修改,并输出了修改后的值。最后在主函数中两次调用了sub函数,传入的参数都是全局变量a的地址。
回答部分参考、引用ChatGpt以便为您提供更准确的答案:
根据提供的图片,这是一个关于指针和数组的问题。数组arr中存储了一组整数,指针p指向arr数组的首地址,然后对数组元素进行了一系列操作。
首先,将指针p指向arr[3],然后执行_p += 2,即将arr[3]的值加2,结果为6。接着,将指针p向后移动两个位置,指向arr[5]。然后执行_p -= 1,即将arr[5]的值减1,结果为9。最后,将指针p向前移动一个位置,指向arr[4],并执行*p += 1,即将arr[4]的值加1,结果为8。
以下是对应的C语言程序解答过程:
#include <stdio.h>
int main() {
int arr[] = {3, 2, 6, 5, 7, 10};
int *p = &arr[3];
*p += 2;
p += 2;
*p -= 1;
p -= 1;
*p += 1;
printf("最后的值是:%d\n", arr[4]);
return 0;
}
最后的值是8。
最近在学习C语言的过程中,忽然发现一个问题,比如说
int a=5,b=3;
a||(b+4)&&((++a)*(++b))
那么这个表达式的值是什么呢?
在C语言中,运算优先级++ > * > && > ||
如果按照生活中的理解来解释“优先级”的概念,那就应该是先算++,然后是乘法,算完这两样之后,先算&&,最后再算||。
然而遗憾的是,程序运行的结果并非如此。
所以到底什么才是运算优先级呢?笔者在这里给出一种解释。
我们可以把优先级理解为括号。
1+2×3,乘法的优先级比加法高,什么意思?我们可以看作是先算2×3,也可以是看作优先级在运算前给式子加了括号,1+(2×3)。
而回过头来看代码中的这个式子,
a||(b+4)&&((++a)*(++b))
实际就可以把优先级理解为,在运算前给式子加括号。
就变成了,
a|| ( (b+4) && ((++a)(++b)) )
这样理解,就和计算机运行没有矛盾了。
也就是说,优先级实际上体现的是一种在运算正式开始之前的预处理(加括号)。
4
8
第一次,因为*p=3,而a=1,所以是4
全局变量被+1
第二次此时a=4,*p=4,所以是8