【问题标题】:This is from thinking in C. I do not see how the variable values are retained这是来自 C 语言的思考。我看不到变量值是如何保留的
【发布时间】:2016-04-10 00:56:21
【问题描述】:

此代码要求 3 个整数,确定奇数/偶数,添加偶数和偶数,赔率和赔率,这就是整个程序,除了我认为莫名其妙的行为之外,它与其他任何内容都没有共享,它的功能正是应该的。

scanf 显然是从 stdio 获取一个值,但它使用了 3 个不同的值,不会忘记它们并吐出正确答案,我不知道为什么,我很乐意牺牲我的前妻换一个回答。

/* lab3.c */
#include <stdio.h>

int main() {
    int osum = 0;
    int esum = 0;
    int n;

    scanf("%d", &n);
    if (n % 2 == 0)
        esum += n;
    else
        osum += n;

    scanf("%d", &n);
    if (n % 2 == 0)
        esum += n;
    else
        osum += n;

    scanf("%d", &n);
    if (n % 2 == 0)
        esum += n;
    else
        osum += n;

    printf("Sum of evens: %d\n", esum);
    printf("Sum of odds: %d\n", osum);
    return 0;
}

【问题讨论】:

  • scanf 将值放入n。这些值在语句esum += nosum += n 中分配给esumosum。你了解+= 运算符的作用吗? (谢谢,但我已经有妻子了,不想要你的前任- :-)。
  • 如果您认为它没有忘记这三个值,请在求和后再次打印。

标签: c


【解决方案1】:

好的,让我们在每一行添加 cmets:

int main() {
  int osum = 0;  /* defines variable osum and initializes it to zero */
  int esum = 0;  /* defines variable esum and initializes it to zero */
  int n;         /* defines variable n */

  printf("Before starting, esum=%d, osum=%d\n", esum, osum);

  scanf("%d", &n);  /* reads an integer from stdin, assigns the value to n */
  if (n % 2 == 0)   /* if n is evenly divisible by 2.... */
    esum += n;      /* then n is added to esum, assigning the result to esum */
  else              /* otherwise n is not evenly divisible by 2... */
    osum += n;      /* so n is added to osum, assigning the result to osum */

  printf("After first read, esum=%d, osum=%d\n", esum, osum);

  scanf("%d", &n);  /* same as above */
  if (n % 2 == 0)   /*  "   "    "   */
    esum += n;      /*  "   "    "   */
  else              /*  "   "    "   */
    osum += n;      /*  "   "    "   */

  printf("After second read, esum=%d, osum=%d\n", esum, osum);

  scanf("%d", &n);  /*  "   "    "   */
  if (n % 2 == 0)   /*  "   "    "   */
    esum += n;      /*  "   "    "   */
  else              /*  "   "    "   */
    osum += n;      /*  "   "    "   */

  printf("Sum of evens: %d\n", esum);  /* prints esum */
  printf("Sum of odds: %d\n", osum);   /* prints osum */
  return 0;                            /* returns value of zero from main */
}

这是否有助于使其更清晰?

编辑

我采纳了@ElliotFrisch 的想法,并在每个 read-and-assign 部分之后添加了 printfs 以显示值如何变化。谢谢,艾略特!

【讨论】:

  • 如果我没看错,程序会执行第一个循环和 printf,然后才进行第二个循环,这就是我没有看到的,我以为它在执行 #1,# 2,#3 printf。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 2022-01-12
  • 2018-08-26
  • 2011-03-21
  • 2021-04-28
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多