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). 似乎解释表达式的方式如下:
如果我尝试在循环中交换某些变量的值,它似乎也可以工作: 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'; } } 我们已经看到交换完成了,但我的编译器给了我这个警告:
如果有警告,我想这不是交换2个变量值的新标准方法,而只是这位教授的一个巧妙的解决方法. 为什么这种方法在C中没有标准化,为什么它确实起作用? 解决方法
这是未定义的行为,并不保证可以正常工作.未指定表达式中参数的评估顺序.因此,允许在执行y = x赋值之前或之后访问减法的y值.
它被指定的原因是允许优化的灵活性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- logback.xml加载属性文件
- oracle 12c vs oracle 11204 优化器特性(optimizer_featur
- reactjs – 如何让React.js组件在Reflux中监听商店
- ruby-on-rails – Sunspot / Solr全文搜索 – 如何索引Rail
- XML序列化及PULL解析,DOM解析,SAX解析
- Vue2.0组件间数据传递示例
- jaxb的使用2 ,包含格式化xml文件
- arrays – 在postgresql中将列从字符串更改为字符串数组
- 跟踪oracle中数据更改的最佳方法
- objective-c – 将UIPickerView添加到UITableView单元格