【问题标题】:I need help understanding this code in C [closed]我需要帮助理解 C 中的这段代码 [关闭]
【发布时间】:2015-12-09 01:23:27
【问题描述】:

我正在学校学习 C,我有这个问题,但我无法解决它。

下面的代码是做什么的?

#define N (100)
int main(void)
{
    unsigned short i = 0;
    unsigned long arr[2*N + 1];
    unsigned long a = 0;
    for (i = 0 ; i < N ; ++i) {
        a ^= arr[i];
    }
    printf("%lu", a);
    return 0;
}

如果您能向我解释一下,那将非常有帮助!
谢谢!

【问题讨论】:

  • 尽可能循环
  • 考虑到arr 未初始化导致未定义行为,几乎任何事情都可能发生。
  • 这不是“做我的家庭作业网站”。如果你有问题,你应该回顾你学到的东西或问你的老师。并告诉她在不需要的情况下使用short 作为数组索引是一个非常糟糕的主意。正确的类型是size_t
  • 100 周围的括号是多余的,顺便说一句。
  • ^ 是按位异或运算符; x ^= yx = x ^ y 的简写。你应该能够从那里弄清楚事情。注意arr 的内容是indeterminate,所以无论你得到什么结果,它都不会很有意义。

标签: c arrays loops for-loop


【解决方案1】:

解释您所理解的内容通常是个好主意,因此我们不必像您什么都不知道一样对待您重要提示:此代码行为不正常。我将在稍后讨论。


异或运算符 (^) 通过将以下模式应用于相关数字的二进制表示来产生结果:

  • 如果两个操作数(运算符的两边)包含不同的位,结果将包含一个1 位。例如,如果左侧包含最右侧位 0,右侧包含最右侧位 1,则结果将包含最右侧位 1。
  • 如果两个操作数(运算符的两边)包含相同的位,则结果将包含 0。

例如,15 ^ 1 的操作数具有以下二进制表示法:

1111 ^
0001

...这个异或运算的结果将是:

1110

转换回十进制,即 14。再次与 1 异或,最终将返回 15(这是愚蠢的异或交换所利用的属性)。


array[index] 运算符获取arrayindex 指示的位置处的元素。


^= 运算符是一个复合运算符。它结合了异或和赋值运算符。 a ^= arr[i]; 大致相当于a = a ^ arr[i];。这意味着:计算aarr[i] 的异或,并将其分配回a


for (i = 0 ; i < N ; ++i) /*
                           * XXX: Insert statement or block of code
                           */

这表示一个循环,将从将值0 分配给i 开始,将在i 小于N (100) 时重复执行语句或代码块,递增i每次。


总而言之,此代码生成数组arr 的前100 个元素的异或。这是一种粗略的校验和算法;我们的想法是获取一组值并将它们简化为单个值,以便您稍后可以对它们执行某种形式的完整性检查,也许是在它们通过互联网或不可靠的文件系统传输之后。


但是,此代码会调用未定义的行为,因为它使用未指定的值。 为了避免不稳定的行为,例如不可预测的值或段错误(或者更糟糕的情况,如 heartbleed OpenSSL 漏洞)您需要确保在尝试使用这些值之前给变量值。

以下声明将第一个元素显式初始化为42,并将所有其他元素隐式初始化为0

unsigned long arr[2*N + 1] = { 42 };

如果您希望将任何未显式初始化的元素归零,则必须认识到声明的初始化部分 = { ... } 是必要的。

【讨论】:

    【解决方案2】:

    此函数将打印不可预测的值。 因为unsigned long arr[2*N + 1]; arr 没有初始化,它会根据你内存中的数据包含随机内容。 a ^= arr[i]; 等于 a = a^arr[i]; 所以它会多次执行此操作(因为循环),然后它会打印它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多