为什么下面的计划有效

时间:2018-07-26 16:07:47

标签: c debugging

#include <stdio.h>

void circle(int *,int *,int *);

int main() {
    int x,y,z;
    printf("please enter 3 numbers = ");
    scanf("%d %d %d",&x,&y,&z);

    circle(&x,&y,&z);

    printf("x=%d  y=%d  z=%d",x,y,z);


}

void circle(int *a,int *b ,int *c) {
    int *d;
    d=*a;
    *a=*b;

    *b=*c;
    *c=d;
}

上面的代码用于使用函数循环交换x, y, z的值。 在上面的代码中,我使用*dd是一个unsigned整数,即使在

d=*a 

如果x(或a)= -1,那么代码也可以工作。

2 个答案:

答案 0 :(得分:1)

void circle(int *a, int *b, int *c) {
  int *d;
  d = *a;
  ...

此处d = *a;int放入指针。

体面的编译器应发出警告,例如:

'=': 'int *' differs in levels of indirection from 'int'

由于int的大小通常小于或等于指针的大小,因此您的代码仍然可以工作,但是它是未定义的行为,因此可能无法在其他平台上工作。未定义的行为包括“正常工作”。

答案 1 :(得分:0)

如果您想知道为什么将负值赋给无符号整数时程序仍然可以工作,那么应该知道在此链接上为负值赋无符号整数时会发生什么:

What happens if I assign a negative value to an unsigned variable?