Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sinys
26 / 26 / 2
Регистрация: 25.12.2008
Сообщений: 177
Завершенные тесты: 1
#1

Что выводит данные програмы - C++

23.03.2009, 21:11. Просмотров 475. Ответов 7
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
char *ch[]={"12345","ABCD","67800","3411"};
char **chp[]={ch+2, ch, ch+1, ch+3};
char ***chpp=chp+1;
main()
{
PRINTS(**chpp++);
PRINTS(*--*++chpp+3);
}

Етот и:
C++
1
2
3
4
5
6
7
8
main()
{
{struct A {int i; char *s; struct A *p;};
static struct A b[]={ {1, "ABCD",b+3}, {2, "ACB" b+2}, {3, "PQR", b+1}, {4, "PRQ", b}};
struct A *ptr=b;
PRINTS(++(ptr->s));
PRINTS(b[++(ptr->p->i)+1].s);
}
Не судите строго задал препод а я ету хрень в первый раз вижу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2009, 21:11     Что выводит данные програмы
Посмотрите здесь:

C++ Сохранить данные между вызовами програмы
что выводит оператор C++
C++ Не выводит с таблицы данные
C++ Разработать программу, которая вводит данные и выводит текст TRUE, буду очень благодарен
C++ Что выводит массив?
Запись динамического массива в файл (не правильно выводит данные) C++
C++ Одна программа записывает данные в файл, а другая их считывает и выводит на экран
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.03.2009, 21:34     Что выводит данные програмы #2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
#define PRINTS(s)  printf("%s\n", (s));
 
main()
{
    char *ch[] = { "12345", "ABCD", "67800", "3411" };
    char **chp[] = { ch+2, ch, ch+1, ch+3 };
    char ***chpp = chp+1;
 
    PRINTS(**chpp++);
    PRINTS(*--*++chpp+3);
    
    return 0;
}
вывод
Код
[guest@station src]$ ./test
12345
00
[guest@station src]$
он будет проверять насколько ты сам думал, так что, прежде чем сдавать, разберись как получились результаты
одноместные операции ++ -- * выполняются справа налево, двуместные операции + выполняются слева направо
Sinys
26 / 26 / 2
Регистрация: 25.12.2008
Сообщений: 177
Завершенные тесты: 1
23.03.2009, 21:48  [ТС]     Что выводит данные програмы #3
А 2й код?
и что делает ->
и что дает вот тут *--*++chpp+3 ответ 00?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.03.2009, 22:00     Что выводит данные програмы #4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
#define PRINTS(s)  printf("%s\n", (s));
 
main()
{
    struct A {
        int i;
        char *s;
        struct A *p;
    };
    static struct A b[] = {
        { 1, "ABCD", b+3 },
        { 2, "ACB",  b+2 },
        { 3, "PQR",  b+1 },
        { 4, "PRQ",  b   }
    };
    
    struct A *ptr = b;
    
    PRINTS(++(ptr->s));
    PRINTS(b[++(ptr->p->i)+1].s);
    
    return 0;
}
вывод
Код
[guest@station src]$ ./test
BCD
Ошибка сегментирования
[guest@station src]$
пытается получить доступ к 7ой структуре, а там всего 4

если дополнить, то всё ок

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
#define PRINTS(s)  printf("%s\n", (s));
 
main()
{
    struct A {
        int i;
        char *s;
        struct A *p;
    };
    static struct A b[] = {
        { 1, "ABCD", b+3 },
        { 2, "ACB",  b+2 },
        { 3, "PQR",  b+1 },
        { 4, "PRQ",  b   }
        
        , { 0, NULL,  NULL    }
        , { 0, NULL,  NULL    }
        , { 7, "hello",  NULL }
    };
    
    struct A *ptr = b;
    
    PRINTS(++(ptr->s));
    PRINTS(b[++(ptr->p->i)+1].s);
    
    return 0;
}
вывод
Код
[guest@station src]$ ./test
BCD
hello
[guest@station src]$
макрос #define перед сдачей ему не показывай, а то заставит объяснять как ты его составил

Добавлено через 3 минуты 6 секунд
*--*++chpp+3 ответ 00
это из третьего слова, он к нему проходит *--*++chpp, а потом смещается на три символа +3

Добавлено через 3 минуты 20 секунд
p->s делает то же самое, что и (*p).s , но в длинных выражениях компилятор не пропустит множественные разыменования в скобках, поэтому p->next->next->next работает а (*p).(*next).(*next).(*next) нет
Sinys
26 / 26 / 2
Регистрация: 25.12.2008
Сообщений: 177
Завершенные тесты: 1
23.03.2009, 22:31  [ТС]     Что выводит данные програмы #5
Нет
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.03.2009, 23:05     Что выводит данные програмы #6
Код
main()
{
{struct A
вторая фигурная лишняя я её стёр
Sinys
26 / 26 / 2
Регистрация: 25.12.2008
Сообщений: 177
Завершенные тесты: 1
23.03.2009, 23:56  [ТС]     Что выводит данные програмы #7
Можеш вот ето по действиям обьяснить: *--*++chpp
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2009, 01:39     Что выводит данные програмы
Еще ссылки по теме:

Не выводит данные с методов класса C++
C++ Напишите программу(код есть), которая согласно запросу пользователя выводит данные об абонентах
Выводит из файла.тхт последние данные два раза C++
C++ При работе с указателями на сервер отправляется мусор, но выводит в консоль норм данные
C++ Не выводит данные из char

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.03.2009, 01:39     Что выводит данные програмы #8
справа налево

Код
++chpp :

(chpp = chpp + 1) == (chp+1 + 1) == (chp + 2) 

chp + 2 == &chp[0] + 2

chp[] = { ch+2, ch, ch+1, ch+3 }
            |          |
          chp[0]     chp[2] 
            |           |
        &chp[0] + 2 == &chp[2]  

++chpp == &chp[2]
Код
*++chpp :

*++chpp == *(&chp[2]) == chp[2]

chp[] = { ch+2, ch, ch+1, ch+3 }
                      |
                     chp[2]

chp[2] == ch+1 == &ch[0] + 1 (ch - это имя массива, а оно как известно превращается в указатель на самый первый элемент, потому ch == &ch[0] также, как chp == &chp[0])

&ch[0] + 1 == &ch[1] также, как &chp[0] + 2 == &chp[2]
Код
--*++chpp :

--*++chpp == --(&ch[0] + 1) == --(&ch[1])

так как мы работаем с chp[2] на данном этапе, оно является именующим выражением и поэтому его можно менять (операция -- содержит присваивание, поэтому требуется, чтобы выражение, к которому она применяется было именующим, то есть с которым возможно провести операцию присваивания)

--(&ch[1]) == --(chp[2]) == chp[2] = chp[2] - 1 == chp[2] = &ch[1] - 1 == chp[2] = &ch[0]
Код
*--*++chpp :

*(&ch[0]) == ch[0]

ch[] = { "12345", "ABCD", "67800", "3411" }
           |
          ch[0]

ch[0] хранит в себе адрес строки "12345", которая записана в неменяемом, но читаемом пространстве и которая называется строковым литералом, или строковой константой, при этом строковая константа относится к классу лексем компилятора, но не относится к константам языка

при выводе берётся адрес первого символа и выводится всё до символа '\0' , которым заканчивается любая строка в языке C
нули второй строки выводятся из-за того, что она доходит до адреса первого символа той строки и потом переходит на три адреса вправо и чтение начинает оттуда и тоже до нуль-символа выводит, у которого тоже адрес есть (если что )
Yandex
Объявления
24.03.2009, 01:39     Что выводит данные програмы
Ответ Создать тему
Опции темы

Текущее время: 07:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru