为什么 "A = A + B - (B = A)" 在 C 中交换值?
Why does "A = A + B - (B = A)" swap values in C?
要交换整数 A 和 B,这似乎适用于 C,
A = A + B - ( B = A);
为什么这行得通?
如果这在所有条件下都有效,是否可以使用它来缩短任何其他常用算法?
你不应该依赖这样的代码来工作,因为它依赖于它是从左到右处理的。
任何不这样做的实现都会失败。
您应该避免编写并非在所有情况下都适用于所有平台、不独立于编译器或依赖于未记录或未明确定义的内容的代码。
那么为什么从左到右它会起作用:
假设 A = 1 和 B = 3
A = A + B - ( B = A);
A = 1 + 3 - (1) = 3
B 的赋值发生在我离开 () 的地方
最重要的是,只有当从左到右处理时,B 到 A 的分配才会发生。
当处理从右到左的相同示例时:
A = A + B - ( B = A);
A = 1 + 1 - (1) = 1
现在 B 的赋值首先发生。
同样,您不应该依赖那些不清楚 reader 正在发生什么的代码,并且依赖于编译器,这里就是这种情况。
实际上它根据标准调用未定义的行为-
C99 §6.5: “2. Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.”
这只是 "shorter" 比 standard/obvious 的方法,在 lines/semicolons 中使用。
- 它引入了额外的操作,这可能不允许编译器进行优化
- 可读性变差(如D.R所述)
- 它(ab)使用非标准行为(如 Marion 所述),这可能会使其在某些编译器中失败
你不应该使用它。
要交换整数 A 和 B,这似乎适用于 C,
A = A + B - ( B = A);
为什么这行得通? 如果这在所有条件下都有效,是否可以使用它来缩短任何其他常用算法?
你不应该依赖这样的代码来工作,因为它依赖于它是从左到右处理的。
任何不这样做的实现都会失败。
您应该避免编写并非在所有情况下都适用于所有平台、不独立于编译器或依赖于未记录或未明确定义的内容的代码。
那么为什么从左到右它会起作用:
假设 A = 1 和 B = 3
A = A + B - ( B = A);
A = 1 + 3 - (1) = 3
B 的赋值发生在我离开 () 的地方
最重要的是,只有当从左到右处理时,B 到 A 的分配才会发生。
当处理从右到左的相同示例时:
A = A + B - ( B = A);
A = 1 + 1 - (1) = 1
现在 B 的赋值首先发生。
同样,您不应该依赖那些不清楚 reader 正在发生什么的代码,并且依赖于编译器,这里就是这种情况。
实际上它根据标准调用未定义的行为-
C99 §6.5: “2. Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.”
这只是 "shorter" 比 standard/obvious 的方法,在 lines/semicolons 中使用。
- 它引入了额外的操作,这可能不允许编译器进行优化
- 可读性变差(如D.R所述)
- 它(ab)使用非标准行为(如 Marion 所述),这可能会使其在某些编译器中失败
你不应该使用它。