交换整数的代码适用于 C++,但不适用于 C
Code for swapping integers works in C++ but not C
我有这个函数可以交换通过引用传递的整数,它在 C++ 中工作正常但在 C 中不起作用。
#include <stdio.h>
void swap(int & x, int & y)
{
int z = x;
x = y;
y = z;
}
int main()
{
int a = 0, b = 1;
swap(a, b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
为什么它在 C 中不起作用?
C 和 C++ 有一些重叠,但它们是两种不同的语言。 C 没有引用。
即使声称 C++ 是 C 的超集也已经过时了。自从 C++ 开始 "C with classes" 以来,C 一直在发展,并不是所有添加到 C 的功能也都合并到 C++ 中。因此,对一个有效的不一定对另一个有效也就不足为奇了。
这是两种不同的语言,你不能指望在一种语言中工作的东西在另一种语言中工作,在 C 中不可能通过引用传递。
但是,您可以通过指针传递:
#include <stdio.h>
void swap(int* const x, int* const y)
{
int z = *x;
*x = *y;
*y = z;
}
int main()
{
int a = 0, b = 1;
swap(&a, &b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
这一行将 2 个参数声明为 references:
void swap(int & x, int & y)
C语言没有引用
如果您尝试使用 C 编译器编译它,您应该得到:
error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
C 语言中的 AS 能够更改某个变量的实际值,您应该通过引用调用它,因此在此代码中为了能够在变量之间更改(交换)您应该使用地址调用方法(在这里,当你完成 swape 函数时,复制的变量将从内存中删除,实际变量将保持相同的值)
#include <stdio.h>
void swap(int* x, int* y)
{
*x=*x^ *y;
*y=*x ^ *y;
*x=*x ^ *y;
}
int main()
{
int a =0, b = 1;
swap(&a,&b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
注意:交换(a,b);在 c 语言中是错误的你应该通过地址传递这些变量以便能够将它们的值交换为交换函数 return void
另一个解决方案
#include <stdio.h>
void swap(int* x, int* y)
{ int z = *x ;
*x = *y ;
*y=z;
}
int main()
{
int a = 0, b = 1;
swap(&a, &b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
C 没有引用,但你可以使用指针或制作宏:
#include <stdio.h>
#define swap(X,Y) do {int Z=X; X=Y; Y=Z;} while(0)
int main()
{
int a = 0, b = 1;
swap(a, b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
我有这个函数可以交换通过引用传递的整数,它在 C++ 中工作正常但在 C 中不起作用。
#include <stdio.h>
void swap(int & x, int & y)
{
int z = x;
x = y;
y = z;
}
int main()
{
int a = 0, b = 1;
swap(a, b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
为什么它在 C 中不起作用?
C 和 C++ 有一些重叠,但它们是两种不同的语言。 C 没有引用。
即使声称 C++ 是 C 的超集也已经过时了。自从 C++ 开始 "C with classes" 以来,C 一直在发展,并不是所有添加到 C 的功能也都合并到 C++ 中。因此,对一个有效的不一定对另一个有效也就不足为奇了。
这是两种不同的语言,你不能指望在一种语言中工作的东西在另一种语言中工作,在 C 中不可能通过引用传递。
但是,您可以通过指针传递:
#include <stdio.h>
void swap(int* const x, int* const y)
{
int z = *x;
*x = *y;
*y = z;
}
int main()
{
int a = 0, b = 1;
swap(&a, &b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
这一行将 2 个参数声明为 references:
void swap(int & x, int & y)
C语言没有引用
如果您尝试使用 C 编译器编译它,您应该得到:
error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
C 语言中的 AS 能够更改某个变量的实际值,您应该通过引用调用它,因此在此代码中为了能够在变量之间更改(交换)您应该使用地址调用方法(在这里,当你完成 swape 函数时,复制的变量将从内存中删除,实际变量将保持相同的值)
#include <stdio.h>
void swap(int* x, int* y)
{
*x=*x^ *y;
*y=*x ^ *y;
*x=*x ^ *y;
}
int main()
{
int a =0, b = 1;
swap(&a,&b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
注意:交换(a,b);在 c 语言中是错误的你应该通过地址传递这些变量以便能够将它们的值交换为交换函数 return void
另一个解决方案
#include <stdio.h>
void swap(int* x, int* y)
{ int z = *x ;
*x = *y ;
*y=z;
}
int main()
{
int a = 0, b = 1;
swap(&a, &b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}
C 没有引用,但你可以使用指针或制作宏:
#include <stdio.h>
#define swap(X,Y) do {int Z=X; X=Y; Y=Z;} while(0)
int main()
{
int a = 0, b = 1;
swap(a, b);
printf("a is now %d\n", a);
printf("b is now %d\n", b);
}