Как 0 + = VARIABLE приводит к VARIABLE + 1? - PullRequest
0 голосов
/ 05 марта 2011

Я столкнулся со странной ошибкой при обновлении счетчика, который используется для вычисления переменной для оператора switch.

int iCount был назначен ноль вне цикла, и это счетчик, используемый дляЦикл while.

Чтобы обновить счетчик внутри цикла, я написал iCount+= packedCount, где в этом случае значение PackCount равно 7.В отладчике, однако, 0 + = packCount привел к пакету PackCount + 1, который был равен 8. Это привело к тому, что слот массива оставался незаполненным на протяжении всего цикла.

Когда я изменил строку на icount= packedCount+iCount, собственнобыло возвращено значение.

Итак, это поведение уникально для C, поскольку я регулярно делаю это на Java без каких-либо странных эффектов.

EDIT - Добавлен фрагмент кода

#define SKIP   8
#define PACKED 7

int iCount;
iCount=0;

while (iCount < characters-1){  
    for (packedCount=iCount; packedCount< iCount+PACKED; packedCount++){ 
        //ASCII compressor logic goes here
    }
    //iCount+= packedCount; //this produces 8 for 0+packedCount

    //this works
    iCount= iCount+packedCount; //skip the next byte in array, since it was already packed
}

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Что касается компиляторов

iCount += packedCount;
iCount = iCount + packedCount;

идентичны. Если они дают разные результаты, то что-то в вашем коде приводит к сбою iCount - возможно, неверная ссылка на указатель.

1 голос
/ 05 марта 2011

Попробуйте это и другие варианты, которые вы можете придумать:

#define SKIP   8
#define PACKED 7

int iCount;
iCount=0;

while (iCount < characters-1){  
    for (packedCount=iCount; packedCount< iCount+PACKED; packedCount++){ 
        //ASCII compressor logic goes here
    }
    printf("iCount after the inner loop: %d\n", iCount);             /* DEBUG */
    printf("packedCount after the inner loop: %d\n", packedCount);   /* DEBUG */

    //iCount+= packedCount; //this produces 8 for 0+packedCount

    //this works
    iCount= iCount+packedCount; //skip the next byte in array, since it was already packed

    printf("iCount after update: %d\n", iCount);                     /* DEBUG */
}
...