2015-02-26 2 views
1

Я учусь на среднесрочную перспективу, и у меня возникают проблемы с этой программой.Структуры и интерпретации кода

В int main (void), первый printf должен напечатать Jello,3.14159 я проследить, как он печатает Jello,3.14, но не 159 - где же u.q.a пункт?

/*:;<=>[email protected] */ 
#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; 
} 
+0

Вы имели в виду подписать этот C, а не C++? (Надеюсь, что так!) – BoBTFish

+2

Действительно ли они учат вас C++, который выглядит так? Как жаль. – user2079303

+0

'uqa' хранит копию' xa', которая, в свою очередь, была инициализирована до 159 –

ответ

2

первый Printf должен напечатать "Желе, 3,14159" я проследить, как он печатает в Желе, 3,14, но не 159 ...

и

где означает «uqa»?

Ответы на оба вместе. Вот соответствующий выход:

3.14159 

Что происходит из формата PRINTF: %.2lf%d. 3.14 исходит из первой части спецификации, %.2lf, в которой говорится, что ожидается длинное плавание, чтобы показать номер с точностью до 2 цифр. См википедии больше на printf форматированием: https://en.wikipedia.org/wiki/Printf_format_string

159 происходит от u.q.a (который является то, что он указывает на), и вносится в форматирование с помощью %d в конце описания. Первоначально он был присвоен структуре R, которая имеет inta. и он становится частью q структуры S, f.

0

u.q.a получает значение целого числа a от x (типа struct R). Фактически, u.q.a совпадает с x.a в качестве указателя q в u (типа struct S) указывает на адрес x.
Поскольку значение a в x установлено на 159, оно печатается с последнего %d первого printf.

PS: Пожалуйста, используйте значащие имена для переменных, чтобы избежать путаницы и сделать код более простым и быстрым для чтения.