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

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

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

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

23.03.2009, 21:11. Просмотров 495. Ответов 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++
Такой вопрос - как сохранить в программе данные? Ну например: телефонный справочник - пользователь вводит "Иванов +7-ХХХ-ХХХ-ХХХХ" и...

Не выводит с таблицы данные - C++
По заданию нужно сделать чтобы выводила самого старшего студента, но на выходе получается что нет старшего студента. Я не знаю из-за чего...

Не выводит данные из char - C++
char s=""; char r=""; puts("Введите название вашего уч. заведения: "); gets(s); puts("Введите название группы: "); ...

Программа не выводит данные - C++
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> #include <time.h> using...

Программа выводит неточные данные - C++
Из задания: Написать программу, которая: 1) Может обрабатывать данные группы студентов. 2) Вести учет по каждому студенту. 3)...

Не выводит данные с методов класса - C++
почему с unionSets() не выводит данные?:wall: #include "stdafx.h" #include "iostream" using namespace std; class Set{ ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4821 / 3241 / 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
Сообщений: 185
Завершенные тесты: 1
23.03.2009, 21:48  [ТС] #3
А 2й код?
и что делает ->
и что дает вот тут *--*++chpp+3 ответ 00?
accept
4821 / 3241 / 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
Сообщений: 185
Завершенные тесты: 1
23.03.2009, 22:31  [ТС] #5
Нет
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.03.2009, 23:05 #6
Код
main()
{
{struct A
вторая фигурная лишняя я её стёр
Sinys
26 / 26 / 2
Регистрация: 25.12.2008
Сообщений: 185
Завершенные тесты: 1
23.03.2009, 23:56  [ТС] #7
Можеш вот ето по действиям обьяснить: *--*++chpp
accept
4821 / 3241 / 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
нули второй строки выводятся из-за того, что она доходит до адреса первого символа той строки и потом переходит на три адреса вправо и чтение начинает оттуда и тоже до нуль-символа выводит, у которого тоже адрес есть (если что )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.03.2009, 01:39
Привет! Вот еще темы с ответами:

Выводит из файла.тхт последние данные два раза - C++
product(std::ifstream&amp; fin) { fin&gt;&gt;Name; fin&gt;&gt;Belok; fin&gt;&gt;Gur; fin&gt;&gt;Yglevod; fin&gt;&gt;Kkal; ...

Запись динамического массива в файл (не правильно выводит данные) - C++
Выделяю память под массив, заполняю его числами. int *mem_arr; int i; int n = 50; mem_arr = (int *)malloc(n*sizeof(int)); ...

Одна программа записывает данные в файл, а другая их считывает и выводит на экран - C++
Задача состоит в том чтоб одна программа записала данные в файл а другая их считала и вывела на экран как полагается, запись и считывание...

При работе с указателями на сервер отправляется мусор, но выводит в консоль норм данные - C++
День добрый! Отправляю на сервер разные штуки и на снифер это ловлю, вот что получается: char buf = &quot;AAABBB&quot;; на снифере AAABBB -...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.03.2009, 01:39
Ответ Создать тему
Опции темы

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