一切! 请有人帮我解决这个任务。我需要交换变量值而不使用任何赋值符号。我尝试用while循环来做这件事,但我不能在任何地方存储计数器值。提前谢谢大家。
答案 0 :(得分:7)
您可以使用Interlocked.Exchange
。
答案 1 :(得分:6)
由于整数在C#中是不可变的,因此不能“在不使用任何赋值的情况下交换整数变量”;你需要以某种方式将它们重新分配到某个地方。也许你的意思是Swap two variables without using a temp variable?
或者,如果您的意思是没有明确地使用=
,@ Konrad Rudolph的回答是要走的路。
答案 2 :(得分:6)
Xor-swap使用分配。但也许你可以使用递增和递减(严格来说,在C#中解析为+= 1
和-= 1
但从逻辑上讲它们通常被认为是不同的。)
int tmp = 0; // C# complains if we don’t initialize!
while (a-- > 0)
tmp++;
while (b-- > 0)
a++;
while (tmp-- > 0)
b++;
这是一种有时用于原始计算分析的逻辑,例如LOOP程序形式。当然,这些形式不需要字段的初始化,否则整个“无分配”规则将完全没有实际意义。在严格的微积分中,tmp
也必须通过循环进行零初始化:
while (tmp > 0)
tmp--;
无论tmp
之前有什么价值(tmp > 0
提供{{1}},这都是有效的,这通常是所有这些结石中的要求:负数不存在。)
但是,再次强调这一点,C#需要我们初始化每个局部变量(非局部变量是默认初始化的)所以这个循环在C#中是多余的,并且初始化仍然是必需的。
正如@Doc Brown在评论中指出的那样,这只适用于(正!)整数 - 虽然理论上(再一次:不在C#中),这可以用于任何可以在Von上表示的类型Neumann架构,因为它们都作为数字驻留在内存中(到某些基础)。
答案 3 :(得分:4)
class Program
{
private static void Swap(ref int a, ref int b)
{
int.TryParse((a ^ b).ToString(), out a);
int.TryParse((a ^ b).ToString(), out b);
int.TryParse((a ^ b).ToString(), out a);
}
static void Main(string[] args)
{
int a = 42;
int b = 123;
Console.WriteLine("a:{0}\nb:{1}", a, b);
Swap(ref a, ref b);
Console.WriteLine("a:{0}\nb:{1}", a, b);
}
}
答案 4 :(得分:2)
请参阅Bit Twiddling Hacks,它会告诉您如何在不使用作业的情况下以多种不同方式执行此操作。
答案 5 :(得分:2)
xor-swap是否计数?
x ^= y;
y ^= x;
x ^= y;
答案 6 :(得分:2)
int i = 10, j = 20;
i = i + j;
j = i - j;
i = i - j;
答案 7 :(得分:0)
我不认为这在C#中是可能的。
XOR答案是标准答案,但您只能抓住内存并直接在较低级别的语言中操作其值。
.net语言将允许您执行等效的XOR操作并返回值,但是为了存储它,您仍然必须分配它,据我所知。根据我的想法,您只是没有直接内存访问权来执行此操作...