加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的魔法用这个表达式x = y – x(y = x)[复制]

发布时间:2020-12-16 10:41:12 所属栏目:百科 来源:网络整理
导读:参见英文答案 Why are these constructs using pre and post-increment undefined behavior?????????????????????????????????????14个 在Python中,您可以使用如下表达式轻松地交换2个变量的值: x,y = y,x 另一方面,在C中,如果要交换2个变量的值,通常使用临
参见英文答案 > Why are these constructs using pre and post-increment undefined behavior?????????????????????????????????????14个
在Python中,您可以使用如下表达式轻松地交换2个变量的值:

x,y = y,x

另一方面,在C中,如果要交换2个变量的值,通常使用临时变量来存储其中一个变量的值,如下所示:

int var1 = 100;
int var2 = 200;

int temp = var1;
var1 = var2;
var2 = temp;

这很简单,但你必须编写很多代码.

我一直在关注C讲座的教授发现了一种新的紧凑方式,以神奇的方式交换2个变量的值:

int x = 200;
int y = 100;

x = y - x + (y = x);

这似乎令人难以置信,但它适用于他正在使用的编译器和我的Apple LLVM版本6.0(clang-600.0.56).

似乎解释表达式的方式如下:

  1. (y = x) // returns the value of x
  2. -x + x = 0
  3. x = y + 0
  4. x = y
  5. y = x // finally,y receives the initial value of x

如果我尝试在循环中交换某些变量的值,它似乎也可以工作:

for (int i = -10; i <= 10; i++) {
    for (int j = 10; j >= -10; j--) {
        int x = i,y = j;
        x = y - x + (y = x);

        std::cout << "x = " << x << "ny = " << y << 'n';
    }
}

我们已经看到交换完成了,但我的编译器给了我这个警告:

main.cpp:28:22: warning: unsequenced modification and access to ‘y’
[-Wunsequenced]

如果有警告,我想这不是交换2个变量值的新标准方法,而只是这位教授的一个巧妙的解决方法.

为什么这种方法在C中没有标准化,为什么它确实起作用?

解决方法

这是未定义的行为,并不保证可以正常工作.未指定表达式中参数的评估顺序.因此,允许在执行y = x赋值之前或之后访问减法的y值.

它被指定的原因是允许优化的灵活性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读