首页 > 编程知识 正文

c语言的异或运算符,c语言条件运算符

时间:2023-05-05 21:01:00 阅读:16719 作者:3465

今天看了某大神的博客,很受感动。 我决定也发博客证明我活着。 因此,我查看并整理了以前学习的笔记,得到了关于通过异或运算交换变量值的笔记。

首先,让我们来看看下面的三组公式。 他们看起来可以交换两个变量的值。

a=a ^ b;

b=a ^ b;

a=a ^ b;

a=a^(b=b^ ) a=a^b ) );

a ^=b ^=a ^=b;

但是,实际上,前两组式在c、c、Java中都能够顺利地进行变量值的交换。 另一方面,第3组的公式只在c、c中通过,但在Java中得到了意想不到的结果。 请参阅以下屏幕截图

在C、C中得到了想要的结果

在Java中,得到了这样的结果

怎么样,很惊讶吧? 在java中,a的值变为b,但无论怎么做,a的值都是0。 为什么会这样? 怎么想也不知道。 这件事就搁在这里了。

过了很长时间后,在我在意偶然的机会,我在关于Java谜题的手册中看到了这个问题。 这还是Java的经典谜题之一。

本来,事情就是这样的。

可以看出,过去中央处理器只有少数寄存器时,利用异或运算符(^ )的属性) x ^ y ^ x )=y可以避免临时变量的使用。 这种惯用法曾在c编程语言中使用,并进一步嵌入到c中,但不能保证一切都能正常工作。 但是,可以肯定的是,在Java中不会正常工作。

根据Java语言规范,操作符的操作数从左到右进行评估。 为了确定表达式x ^=expr的值,在计算expr之前提取x的值,并且将这两个值的异或的结果赋予变量x。 在OprDemo程序中,变量x的值被提取——两次,每次出现在公式中时提取——一次,但是提取两次是在所有赋值操作之前。

下面的代码很好地解释其原理,并解释为什么会得到这样的结果

//Java中x^=y^=x^=y的实际行为

int tmp1=x; //x在公式中首次出现

int tmp2=y; //y的首次亮相

int tmp3=x ^ y; 计算//x^y

x=tmp3; //最后赋值:将x ^ y存储在x中

y=tmp2 ^ tmp3;//第二个赋值:将第一个x的值存储在y中

x=tmp1 ^ y; //第一个赋值:从0存储到x

从上面的代码可以看出,a实际上等于0是因为a^a,这意味着两个相同的值被异或,并且值等于0。

在c和c中,没有指定公式的计算顺序。 执行表达式x^=expr时,许多c编译器和c编译器在计算expr后提取x的值,因此上述方法可以获得正确的结果。

那么,Java有没有方法不使用中间变量的单个表达式来实现这个目的? 这个很好。 请看下面的代码。

y=(x^=) y^=x ) ) y; 这个代码能行

写这么多的话,最后想说的是,不要用单一的公式将两次代入同一变量中。 赋值次数多了,就会引起混乱。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。