在采访中提出的一个非常棘手的问题.
交换两个变量的值,如a=10和b=15.
通常要交换两个变量值,我们需要第三个变量,如:
temp=a;
a=b;
b=temp;
Run Code Online (Sandbox Code Playgroud)
现在的要求是,在不使用第三个变量的情况下交换两个变量的值.
我发现这个代码使用XOR ^运算符交换两个数字而不使用第三个变量.
码:
int i = 25;
int j = 36;
j ^= i;
i ^= j;
j ^= i;
Console.WriteLine("i:" + i + " j:" + j);
//numbers Swapped correctly
//Output: i:36 j:25
Run Code Online (Sandbox Code Playgroud)
现在我将上面的代码更改为此等效代码.
我的代码:
int i = 25;
int j = 36;
j ^= i ^= j ^= i; // I have changed to this equivalent (???).
Console.WriteLine("i:" + i + " j:" + j);
//Not Swapped correctly
//Output: i:36 j:0
Run Code Online (Sandbox Code Playgroud)
现在,我想知道,为什么我的代码输出不正确?
请考虑以下C++标准ISO/IEC 14882:2003(E)引用(第5节,第4段):
除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.53)在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.[例:
Run Code Online (Sandbox Code Playgroud)i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented- 末端的例子]
我很惊讶,i = ++i + 1给出了一个未定义的值i.有没有人知道编译器实现不能给出2以下情况?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
Run Code Online (Sandbox Code Playgroud)
事情是operator=有两个args.第一个总是i参考.在这种情况下,评估顺序无关紧要.除了C++ Standard禁忌之外,我没有看到任何问题.
请,不要不考虑这样的情况下,参数的顺序是评价非常重要.例如, …
为什么以下用C++编译?
int phew = 53;
++++++++++phew ;
Run Code Online (Sandbox Code Playgroud)
相同的代码在C中失败,为什么?
我如何导入头文件是否重要?我看过双引号和箭头.
#include <stdlib.h>
#include "Some_Header.h"
Run Code Online (Sandbox Code Playgroud)
如果他们也以某种方式资本化是否重要?试验这一点似乎无关紧要,但我认为教学必须有这样做的理由.
另一个问题是,(来自Java这里),如何访问其定义的文件之外的类?说,我有one.cpp和two.cpp.
在one.cpp中:
class Something {
...
Run Code Online (Sandbox Code Playgroud)
在two.cpp中:
class SomethingElse {
Something *example;
...
Run Code Online (Sandbox Code Playgroud)
像那样?在Java中,您只需在"public"前面添加一个类名.在C++中,争论类似乎有点困难.
int x=1;
int y=2;
x ^= y ^= x ^= y;
Run Code Online (Sandbox Code Playgroud)
我期待值被交换.但它给出x = 0和y = 1.当我尝试使用C语言时,它会给出正确的结果.
我已经阅读了几个来源,讨论如何在不使用第三个变量的情况下交换两个数字.以下是一些最相关的:
我理解为什么在大多数情况下使用所描述的方法没有意义:代码变得混乱且难以阅读,并且通常比使用第三个"临时"变量的解决方案执行得更慢.但是,我发现的所有问题都没有讨论双变量方法在实践中的任何好处.他们是否有任何救赎品质或利益(历史或现代),或者它们仅作为晦涩的编程琐事有用吗?
嘿家伙我想要你的建议,如何在没有第三个变量的情况下改变两个变量的值.目标cc.有没有办法通知我,
我最近在一个社区中读到,我们可以轻松地交换两个数字而不使用第三个使用XOR技巧.
立方公尺= N ^ =立方公尺= N; 提到了一些技巧.
你们有什么感想?这个技巧总是有用吗?
c++ ×5
swap ×3
c ×2
xor ×2
algorithm ×1
c# ×1
coding-style ×1
header-files ×1
iphone ×1
java ×1
objective-c ×1
operators ×1
standards ×1