2017-05-10 22 views
0

난 그냥 잘 작동이 코드가 있습니다직접 함수 호출로 변수를 바꿀 때 다른 결과가 나타나는 이유는 무엇입니까?

long nodeDistance(node_t a, node_t b) { 
    long d1 = abs(a.passi_1 - b.passi_2); 
    long d2 = abs(a.passi_2 - b.passi_2); 
    return d1 + d2; 
} 

내가 링크 된리스트를 호출, 그리고 그것은 그럴듯한, 긍정적 인 결과 (120,259,067,966)을 반환합니다. 그러나 두 변수를 모두 인라인하면 아주 이상하게 작동합니다. 나는 또한 컴파일이 훨씬 느리다는 것을 알았다.

long nodeDistance(node_t a, node_t b) { 
    return abs(a.passi_1 - b.passi_1) + abs(a.passi_2 - b.passi_2); 
} 

동일한 링크 된 목록을 통해 호출 할 때 음수 (-16322)를 반환합니다. 왜 이런거야? absint를 반환, 그래서 abs(...) + abs(...)의 결과가 다음 return 키워드로 long에 캐스팅 (하는 것입니다 때로는 오버 플로우), int입니다 : 두 번째 기능은 오버 플로우 때문에

+7

거리를 계산하기위한 공식은 두 코드에서 다릅니다. –

+0

대신'abs()'두 세트의 코드는'labs()'를 사용해야합니다. – user3629249

답변

2

이 발생합니다.

반면에 첫 번째 함수는 long 변수에 저장하여 long으로 피연산자를 캐스팅하므로 합계도 long이며 오버플로는 발생하지 않습니다.