2014-02-16 2 views
1
int get() 
    { 
     static i = 1; 
     return i++; 
    } 

    int main(int argc, char *argv[]) 
    { 
     printf("%d %d %d\n", get(), get(), get()); 
     return 0; 
    } 

Выход: 3 2 1 (Приказ зависит от компилятора)Что касается пост прироста

Вопрос: Но почему это значение, прежде чем приращение возвращается статической переменной (области видимости файла). Что такое правило большого пальца для post/pre increment? Я никогда не ошибаюсь. Пожалуйста помоги.

Хорошо, позвольте мне быть более конкретным, все примеры, которые я читаю, равны a = i++; or a = ++i;, это выражения для увеличения, а затем назначают или присваивают тогда приращение. Но что это за выражения, return i++; func(a++); Я читал это так: «после того, как я ++ ничего не назначил, поэтому верните окончательное добавочное значение» (исправьте меня здесь)

+0

заказ не определен .. но почему это значение возвращается 1? –

+0

Вам нужно прочитать [точки последовательности] (http://en.wikipedia.org/wiki/Sequence_point). – devnull

+0

@codeymonkey Читать http://stackoverflow.com/questions/17366847/what-is-the-difference-between-pre-increment-and-post-increment-in-the-cycle-fo –

ответ

0

Здесь есть два вопроса: продолжительность жизни и область действия.

Область переменной, в которой можно увидеть имя переменной. Здесь i видна только внутри функции get().

Срок службы переменной - это период, в течение которого она существует. Если бы я был определен без ключевого слова static, время жизни было бы от входа в get() до return from get(); поэтому он будет повторно инициализирован до 1 при каждом вызове.

Ключевое слово static действует, чтобы продлить время жизни переменной на время жизни программы; например инициализация происходит один раз и только тогда, а затем переменная сохраняет свое значение - независимо от того, что это стало - по всем будущим вызовам get().

Разница между пост и пред приращением: What is the difference between pre-increment and post-increment in the cycle (for/while)?

Источник: Ответ на this место

Update 1

Сообщение прибавка работает, создавая временную копию существующего значения, то приращения исходное значение, а затем, наконец, возвращает временное выражение в результате выражения. В результате получается, что приращение выполняется после экспрессии, но это не так, и образец программы, демонстрирующий это, довольно прямолинейный, если он заинтересован. Это временная копия, которая делает post-inc дорогостоящей. (Благодаря WhozCraig для коррекции)

Update 2

Оба из них являются постинкремента унарные операции. Оба они создают временную копию операнда (i в первом случае, a во втором), затем увеличивают операнд, а затем возвращают временную копию в результате выражения post-inc. Результат в первом случае: i увеличивается и возвращается значение до приращения. Во втором случае a увеличивается, а функция func вызывается со значением до приращения. (Дано WhozCraig)

+0

К сожалению, верхний ответ в связанном вопросе о довном повышении по умолчанию неверен. Это не так, как это работает, хотя его часто преподают в академических кругах (опять же, к сожалению). Поступок увеличивается, создавая временную копию * существующего * значения, * затем * увеличивая исходное значение, а затем, наконец, возвращая * временный * в результате выражения. В результате появляется * * приращение выполняется после экспрессии, но это не так. Примерная программа, демонстрирующая это, довольно прямолинейна, если она заинтересована. Это временная копия, которая делает post-inc дорогостоящей. – WhozCraig

+0

Хорошо, позвольте мне быть более конкретным, все примеры, которые я читаю, похожи, a = i ++; или a = ++ i; это выражения для приращения, а затем назначить или назначить тогда прирост. Но что это за выражения, верните i ++; FUNC (A ++); Я прочитал это так, после того, как i ++ ничего не назначил, поэтому вернем окончательное значение. –

+1

@codeymodey. Оба из них - это операции с постепенным унаследованием. Оба они создают временную копию операнда ('i' в первом случае,' a' во втором), затем увеличивают операнд, а затем возвращают временную копию в результате выражения post-inc. Результат в первом случае: «i» увеличивается, а его значение * предшествует * приращению. Во втором случае «a» увеличивается, а функция «func» вызывается со значением * before * до приращения. – WhozCraig

Смежные вопросы