英文:
Pointer value difference not as expected
问题
以下是翻译好的部分:
为什么以下代码显示4-5为4而不是*-1*?
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int fun(int *a, int *b){
  *a = *a+*b;
  *b = *a-*b;
}
void main(){
  int a=4;
  int b=5;
  int *p=&a, *q=&b;
  fun(p,q);
  printf("%d\t%d",a,b);
}
求和结果为9(如预期),但为什么差值为4?
英文:
Why does the following code display 4-5 as 4 and not -1?
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int fun(int *a, int *b){
  *a = *a+*b;
  *b = *a-*b;
}
void main(){
  int a=4;
  int b=5;
  int *p=&a, *q=&b;
  fun(p,q);
  printf("%d\t%d",a,b);
}
The sum comes as 9 (as expected), but why does the difference come as 4?
答案1
得分: 2
这将*a + *b的结果赋值给*a,所以在以下代码之后:
*a = *a + *b; // 4 + 5
然后 *a 是 9,所以
*b = *a - *b;
将它变为 *b = 9 - 5,即 4。
这个问题与指针无关。如果不使用指针,你仍然会遇到相同的问题:
int a = 4;
int b = 5;
a = a + b; // 将 4 + 5 的结果 (9) 赋值给 a
b = a - b; // 将 9 - 5 的结果 (4) 赋值给 b
还要注意,由于fun 声明返回一个 int 但没有返回任何东西,因此程序具有未定义的行为。
英文:
This assigns the result of *a + *b to *a, so after
*a = *a + *b; // 4 + 5
then *a is 9, so
*b = *a - *b;
makes it *b = 9 - 5, which is 4.
The problem has nothing to do with pointers. You would have the same problem if you did it without:
int a = 4;
int b = 5;
a = a + b; // assign the result of 4 + 5 (9) to a
b = a - b; // assign the result of 9 - 5 (4) to b
Also note that the program has undefined behavior since fun is declared to return an int but it doesn't return anything.
答案2
得分: 2
以下是翻译好的部分:
首先,所有这些头文件
#include <string.h>
#include <math.h>
#include <stdlib.h>
都是多余的,因为程序中未使用这些头文件中的任何声明。
根据C标准,无参数的main函数应声明如下:
int main(void)
函数fun的返回类型是int,但未返回任何内容。
应该声明如下:
void fun(int *a, int *b)
至于你的问题,在函数的第一条语句之后:
*a = *a + *b;
对象*a已经被更改,在下一条语句中:
*b = *a - *b;
已经使用了对象的新值。
相反,你可以这样写,例如:
void fun(int *a, int *b)
{
    int tmp = *a;
    *a = *a + *b;
    *b = tmp - *b;
}
英文:
For starters all these headers
#include <string.h>
#include <math.h>
#include <stdlib.h>
are redundant because neither declaration from the headers is used in the program.
Further according to the C Standard the function main without parameters shall be declared like
int main( void )
The function fun has return type int but returns nothing.
int fun(int *a, int *b){
It should be declared like
void fun(int *a, int *b){
As for your problem then after the first statement of the function
*a = *a+*b;
the object *a was changed and in the next statement
*b = *a-*b;
there is used already a new value of the object.
Instead you could write for example
void fun( int *a, int *b )
{
    int tmp = *a;
    *a = *a + *b;
    *b = tmp - *b;
}
答案3
得分: 1
If a=4 and b=5:
int fun(int *a, int *b){
   *a = *a+*b;
   *b = *a-*b;
}
This function would:
- [
a=4andb=5]: 第一行将a设置为 9 = (4+5) - [
a=9andb=5]: 第二行将b设置为 4 = (9-5) 
Try this instead:
void fun(int *a, int *b){
   int temp = *a+*b;
   *b = *a-*b;
   *a = temp;
}
英文:
If a=4 and b=5:
int fun(int *a, int *b){
   *a = *a+*b;
   *b = *a-*b;
}
This function would:
- [
a=4andb=5]: the first line setsato 9 = (4+5) - [
a=9andb=5]: the second line setsbto 4 = (9-5) 
Try this instead:
void fun(int *a, int *b){
   int temp = *a+*b;
   *b = *a-*b;
   *a = temp;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论