【问题标题】:Structs & code interpretations结构和代码解释
【发布时间】:2015-02-26 15:29:10
【问题描述】:

我正在准备期中考试,但我在学习这个课程时遇到了问题。

int main (void) 中,第一个printf 应该打印Jello,3.14159 我遵循它如何打印 Jello,3.14 而不是 159 - u.q.a 指向哪里?

/* 01234567890:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ */
#include <stdio.h>
#include <string.h>

struct R {
    char n[6];
    int a;
};

struct S {
    double p;
    struct R q;
};

struct S f(const struct R* x) {
    struct S a;
    a.q = *x;
    a.p = 3.142;
    return a;
}

char g(struct R* y) {
    strcpy_s(y->n, "Wee");
    y->a = 3;
    return *y->n;
}

int main(void) {
    char c;
    struct S u;
    struct R x = { "Jello", 159 };
    u = f(&x);
    printf("%s,%.2lf%d\n", u.q.n, u.p, u.q.a);
    c = g(&x);
    printf("%s,%d.142,%cee\n", x.n, x.a, c);
    x.n[0] -= 3;
    x.n[1] = 'r';
    printf("%seeeeeeeeee\n", x.n);

    return 0;
}

【问题讨论】:

  • 您的意思是标记这个 C,而不是 C++? (希望如此!)
  • 他们真的教你像这样的 C++ 吗?多么不幸。
  • u.q.a 持有x.a 的副本,而x.a 又被初始化为159
  • struct R x = { "Jello", 159 }; 159 被放入int a;in struct r?
  • 是的。你认为它还能做什么?在您最喜欢的 C 或 C++ 教科书中阅读聚合初始化。

标签: c pointers struct printf naming


【解决方案1】:

第一个 printf 应该打印 "Jello,3.14159" 我按照它的打印方式 果冻,3.14 但不是 159...

“u.q.a”指向哪里?

两者一起回答。以下是相关输出:

3.14159

来自 printf 格式:%.2lf%d3.14 来自规范的第一部分,%.2lf,它说,期望一个长浮点数,以 2 位精度显示数字。有关printf 格式的更多信息,请参见维基百科:https://en.wikipedia.org/wiki/Printf_format_string

159 来自u.q.a(这是它所指向的),并由规范末尾的%d 带入格式化。它最初被赋予R 结构,该结构具有inta。它成为S 结构fq 部分。

【讨论】:

    【解决方案2】:

    u.q.axstruct R 类型)中获取整数a 的值。其实u.q.ax.a是一样的,因为u(struct S类型)中的指针q指向x的地址。
    由于xa 的值设置为159,因此它从第一个printf 的最后一个%d 开始打印。

    PS:请为变量使用有意义的名称,以避免混淆,并使代码更易于阅读。

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      相关资源
      最近更新 更多