在C中需要一个简单的帮助

时间:2015-10-23 21:33:05

标签: c

有谁能告诉我这段代码是如何运作的?

int Calc(int *arr, int m)

int result;
for (result &= 0; m; (arr[--m] & (0x1 << 0x1F)) ? result += arr[m]: Void());
return result;

我无法理解循环:/

2 个答案:

答案 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时进行迭代。如果mtrue表达式将返回m != 0

这样做的安全方式是m > 0

你也可以使用这个表达式,它不会使程序更加优化,但是对于另一个程序员来说理解你的代码会更清晰:!!m(将m变量转换为bool),这是等于m != 0;

第3部分

在这部分中使用了三元运算符(logical_expression ? expression_1 : expression_2)。 如果logical_expressiontrue,则expression_1将被执行,否则expression_2将被执行。

因此,在您的代码中,如果此表达式(arr[--m] & (0x1 << 0x1F))返回true,那么我们会将arr[m]添加到result变量中。在另一种情况下什么也不做。

此外,m变量在三元逻辑表达式(arr[--m])中递减。