有条件的问题

Per*_*diu 0 c if-statement

somone可以请我解释一下,也许可以用if格式吗?

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int a = 0, b = 1, c = 3;
  *((a) ? &b : &a) = a ? b : c;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ing 5

这是完全令人费解的代码,永远不要写这样的东西。但是,让我们对其进行分解。这是一项任务,因此我们在=标志的左侧和右侧都有一个部分。

让我们从正确的部分开始,即要分配的值。你有a ? b : c。该三元操作者将计算为b如果表达式a为真,否则值将是c。因此,我们可以使用如下正则表达式编写此代码:

int value;
if (a) {
  value = b;
} else {
  value = c;
}
Run Code Online (Sandbox Code Playgroud)

现在我们去左边,那里*((a) ? &b : &a)。我们应该从内而外阅读它。我们在那里还有另一个三元运算符(a) ? &b : &a。如果表达式的(a)计算结果为true,则值为&b,否则为&a。所以我们可以这样写:

int *pointer;
if (a) {
  pointer = &b;
} else {
  pointer = &a;
}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以像这样进行实际分配:

*pointer = value;
Run Code Online (Sandbox Code Playgroud)

正如Barmar指出的那样,可以做进一步的简化。这两个条件都取决于的值a,因此我们可以将它们折叠为整个代码:

int value;
int *pointer;
if (a) {
  value = b;
  pointer = &b;
} else {
  value = c;
  pointer = &a;
}
*pointer = value;
Run Code Online (Sandbox Code Playgroud)

但这仍然是令人费解的方法,我们不需要所有这些变量。我们可以直接进行分配。然后,我们有了Barmar的版本:

if (a) {
  b = b;
} else {
  a = c;
}
Run Code Online (Sandbox Code Playgroud)

但是由于b未标记volatile(或C ++类),因此对其进行赋值b没有任何效果。不需要第一条陈述。因此,我们可以进一步简化为:

if (!a) {
  a = c;
}
Run Code Online (Sandbox Code Playgroud)