Как работает до и после инкремента в c ++?

я хочу знать, если результаты оператора увеличения / уменьшения отличаются от компилятора к компилятору или он не зависит от компилятора. так как я получаю разные результаты в разных компиляторах c / c ++ (проверено в G ++, TDM, gcc) для одного и того же выражения.

-2

Решение

Давайте посмотрим на внутреннюю сборку llvm. Что не сложно сделать.

Код C ++:

void preincrement() __attribute__((noinline));
void preincrement() {
volatile int x = 10;
volatile int y = ++x;
}

void postincrement() __attribute__((noinline));
void postincrement() {
volatile int x = 10;
volatile int y = x++;
}

int main()
{
preincrement();
postincrement();
}

Результирующая сборка LLVM (за исключением некоторого начального и конечного текста, который не интересен):

; Function Attrs: noinline nounwind uwtable
define void @_Z12preincrementv() #0 {
%x = alloca i32, align 4
%y = alloca i32, align 4
store volatile i32 10, i32* %x, align 4
%1 = load volatile i32* %x, align 4
%2 = add nsw i32 %1, 1
store volatile i32 %2, i32* %x, align 4
store volatile i32 %2, i32* %y, align 4
ret void
}

; Function Attrs: noinline nounwind uwtable
define void @_Z13postincrementv() #0 {
%x = alloca i32, align 4
%y = alloca i32, align 4
store volatile i32 10, i32* %x, align 4
%1 = load volatile i32* %x, align 4
%2 = add nsw i32 %1, 1
store volatile i32 %2, i32* %x, align 4
store volatile i32 %1, i32* %y, align 4
ret void
}

; Function Attrs: nounwind uwtable
define i32 @main() #1 {
tail call void @_Z12preincrementv()
tail call void @_Z13postincrementv()
ret i32 0
}

Здесь мы можем ясно видеть единственное отличие: в пост-инкрементной версии мы используем исходное значение вместо обновленного значения.

В обоих случаях мы просто используем традиционный код операции add для выполнения реальной работы.

1

Другие решения


По вопросам рекламы [email protected]