Rahul Singh Gulia Ответов: 4

Как возникла ценность "я"?


#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5]={5, 1, 15, 20, 25};
    int i, j, m;
    i = ++a[1];
    j = a[1]++;
    m = a[i++];
    printf("\n%d %d %d",i, j, m);
    return 0;
}


Что я уже пробовал:

Я получил результат. И я могу понять значения j=2 и m=20. Но я не могу понять, каково значение i = 3.

KarstenK

а как насчет использования отладчика и одноступенчатого кода?

4 Ответов

Рейтинг:
29

OriginalGriff

Запустите его и выясните ... и когда вы это сделаете, вы должны быть в состоянии понять, почему для себя - вот почему ваш учитель установил это как домашнее задание, в конце концов ...

Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!

Цитата:
Да. Моя проблема была неправильно помещена на портал. Жаль, что. Я обновил свою проблему определенным образом.


Что там внутри a[1]?
Это простой вопрос: значение 1. Так что это увеличивается, и 2 переходит в i.
Затем значение извлекается из a[1] снова: 1. Инкрементированный, и положенный в j.
Затем вы используете i - содержащий 2 - для извлечения из a[2] значение 15, а затем увеличьте i до трех, прежде чем положить 15 в m.

Вы можете посмотреть здесь: Почему x = ++x + x++ дает мне неправильный ответ?[^] - это может сделать его немного яснее.


Rahul Singh Gulia

Да. Моя проблема была неправильно помещена на портал. Жаль, что. Я обновил свою проблему определенным образом.

OriginalGriff

Ответ обновлен

Рейтинг:
20

KarstenK

внимательно прочитайте свой код

i = ++a[1];
j = a[1]++;//increment 1 (now two)
m = a[i++];//incrementing once again
Я действительно неприязнь к утверждениям в одной строке. Источник странных ошибок...


Рейтинг:
14

Jochen Arndt

Что касается переменной i просто делайте в уме то, что происходит (или на листе бумаги, или вставляя комментарии в свой код):

i = ++a[1];
// a[1] is 1
// ++ prefix: is 2
// 2 is assigned to i

// ...

m = a[i++];
// i is post incremented here: is 3


Рейтинг:
0

Patrice T

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Обратная сторона этого решения:
- Это DIY, вы один отслеживаете проблему и находите ее корни, которые ведут к решению.
Положительная сторона этого решения:
- Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.