我想在這個程式中計算兩個變數的和和絕對差值。
#include <stdio.h>
#include <stdlib.h>
void update(int *a,int *b) /span> {
//完成這個函式
*a= *a *b;
*b= abs(a-b)。
}
int main() {
int a, b;
int *pa = &a, *pb = &b;
scanf("%d %d", &a, & b);
update(pa, pb);
printf("%d
%d", a, b)。)
return 0。
}
但是對于某些輸入來說,這并不能產生正確的絕對差值輸出。例如,(4,5)產生正確的輸出;(2,6)卻不能。我無法弄清楚這個錯誤。原因是什么?
uj5u.com熱心網友回復:正如在其他答案中指出的那樣,減去兩個指標是UB。
為了回答問題的其他部分。 試著理解在算術操作的每個點上指標值發生了什么,
為了回答問題的另一部分,我們需要了解指標值發生了什么。
void update(int *a, int *b) {
///完成這個函式。
*a= *a *b; //<< 這里*a有*a和*b之和。
*b= abs(*a-*b)。
//此處*a本身是*a *b
//所以整個操作是abs(*a *b -*b),因此*b的值是abs(*a)。
嘗試用區域變數來保持中間值,并在最后進行賦值,
void update(int *a, int *b) {
int sum = *a *b;
int diff = abs (*a -*b)。
*a= sum;
*b= diff。
}
uj5u.com熱心網友回復:
*b= abs(a-b)。
你正在減去指標,這是未定義的行為,因為它們沒有指向同一個陣列。 你應該減去它們所指向的數字。 這樣做吧
*b= abs(*a-*b)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322477.html
標籤:
