有谁能告诉我这段代码是如何运作的?
int Calc(int *arr, int m)
int result;
for (result &= 0; m; (arr[--m] & (0x1 << 0x1F)) ? result += arr[m]: Void());
return result;
我无法理解循环:/
答案 0 :(得分:4)
你在哪里找到这个代码所以我可以追捕那个人并用Schildt 的副本击败他?
你不理解循环并不奇怪;这不是可以理解的。唯一可以接受此类代码的地方是IOCCC,除非它没有为该竞争对其进行足够的 。
依次拿走每一位:
result &= 0;
是将result
初始化为0
的真正时髦方式;它是result = result & 0
的简写,它对result
执行0
的按位与AND(给出0
)并将结果分配回result
。它也是不安全的,因为未初始化的对象可能包含陷阱表示。那个 应该简单地写成result = 0
。
m;
只检查m
的当前值;循环将一直运行直到它为0.循环基本上从最后一个元素开始,然后向下运行到第一个元素。
(arr[--m] & (0x1 << 0x1F)) ? result += arr[m]: Void()
唉。所以,它首先要做的是在索引m-1
处获取数组的值,并对and
进行逐位0x1 << 0x1F
(1个左移31个帖子,或基本上0x80000000
);如果此操作的结果非零,那么我们将该数组元素的值添加到result
,否则我们执行一些非常不合适的命名函数,希望返回{{1} } 1 。鉴于我们正在处理有符号整数,并且在大多数平台上0
是32位宽,这段代码显然在int
中累加了负值。
一种略显理智的写作方式
result
<小时/> 1。条件运算符
result = 0;
while ( m ) // or m != 0, or m > 0, whatever you prefer
{
if ( arr[--m] < 0 )
result += arr[m];
}
并不打算用作这样的控制结构。语法为?:
。首先,评估expr1 ? expr2 : expr3
并应用所有副作用;如果它导致非零值,则表达式的结果为expr1
;否则,结果为expr2
答案 1 :(得分:2)
第1部分
Firstrly result &= 0
用于使用按位0
操作将result
设置为AND
变量。按位0将返回0.
您可以这样写:result = 0
这样做的更好(更优化)方式是:result ^= result
。 (按位XOR
)
第2部分
此循环将在m
大于(或小于)0时进行迭代。如果m
,true
表达式将返回m != 0
。
这样做的安全方式是m > 0
。
你也可以使用这个表达式,它不会使程序更加优化,但是对于另一个程序员来说理解你的代码会更清晰:!!m
(将m
变量转换为bool),这是等于m != 0
;
第3部分
在这部分中使用了三元运算符(logical_expression ? expression_1 : expression_2
)。
如果logical_expression
为true
,则expression_1
将被执行,否则expression_2
将被执行。
因此,在您的代码中,如果此表达式(arr[--m] & (0x1 << 0x1F))
返回true
,那么我们会将arr[m]
添加到result
变量中。在另一种情况下什么也不做。
此外,m
变量在三元逻辑表达式(arr[--m]
)中递减。