Categories
сметачи

++i vs. i++

Екзистенциалните спорове ++i срещу i++ (за случаите, в които i е интегрална променлива и не се интересуваме от върнатата стойност) заемат особено място в сърцата на c-програмистите.

От извстно време свикнах да пиша ++i. Четящите реагират странно на for (i = 0; i < MAX; ++i) и освен че изглежда по-хакерско поради мързел не бях проучил дали има някаква реална разлика между двата варианта.

Сигурно нямаше да преодолея мързела ако не беше Румен, когото не успях да убедя, че ++i е по-бързия и по-малко паметоизползващ вариант. Ето тестовете, които направихме:

[nikolay@nikolay c]$ gcc -v
Using builtin specs.
gcc version 2.95.4 20020320 [FreeBSD]

[nikolay@nikolay c]$ less prefix.c
#include <stdio .h>
int main()
{
        int i;
        scanf("%d", &i);
        ++i;
        return 0;
}

[nikolay@nikolay c]$ less postfix.c
#include <stdio .h>
int main()
{
        int i;
        scanf("%d", &i);
        i++;
        return 0;
}

[nikolay@nikolay c]$ gcc -Wall -S postfix.c -o postfix.asm

[nikolay@nikolay c]$ gcc -Wall -S prefix.c -o prefix.asm

[nikolay@nikolay c]$ diff postfix.asm prefix.asm
1c1
< .file   "postfix.c"
---
>       .file   "prefix.c"

Сега като се замисля няма особен смисъл да се чете числото от стандартния вход, но елементът изненада дава по-малка възможност на компилатора да прояви шмекерските си способности (много е хитро копелето–вервайте ми).

Изводът: ммм, няма особена разлика между двете. Даже никаква. Живейте свободно и не се карайте за глупости. Поне не за тази.

2 replies on “++i vs. i++”

Абе онзи умния по информатика всеки ден говори по въпроса каква е разликата между ++i и i++. Първото първо инкрементва, после биде проверяване в лоопа, второто биде проверявано, и после инкрементва, или нещо такова.

Е то това ясно. Ако е имал предвид разбира се, че едното ти връща вече увеличената стойност, а другото увеличава след като ти върне старата.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.