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)
这是完全令人费解的代码,永远不要写这样的东西。但是,让我们对其进行分解。这是一项任务,因此我们在=标志的左侧和右侧都有一个部分。
让我们从正确的部分开始,即要分配的值。你有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)