Это очень хороший вопрос.
Чтобы понять это, вам лучше знать, как коды C выполняются на компьютере: Сначала компилятор скомпилирует код C в код сборки, а затем коды сборки будут переведены в машинный код, который может работать в основной памяти непосредственно.
Что касается вашего кода:
void main() {
int i, j=6;
for(; i=j ; j-=2)
printf("%d",j);
}
Чтобы понять, почему результат 642, Мы хотим видеть свой код сборки.
Использование VS режим отладки, мы можем видеть:
Особенно посмотрите на это:
010217D0 mov eax,dword ptr [j]
010217D3 mov dword ptr [i],eax
010217D6 cmp dword ptr [i],0
010217DA je main+4Fh (010217EFh)
четыре линии сборки кода, соответствующего невозможному кода C "I = J" , это означает, что сначала переместите значение j для регистрации eax, затем переместите значение регистра eax на i (поскольку компьютер не может напрямую переместить значение j в i, он просто использует регистр eax в качестве моста), а затем сравните значение i с 0, если они равны, перейти к 010 217EFh, петля заканчивается; если нет, цикл продолжается.
Так что на самом деле это первое задание, затем сравнение, чтобы решить, закончен ли цикл; поскольку 6 отклоняется до 0, цикл, наконец, останавливается, я надеюсь, что это поможет вам понять, почему результат равен 642: D
Это должно быть * выражение *, а присваивание - выражением. –
Нет инициализации, есть задание. Btw 'void main' нестандартен. –
Это в основном сокращение для '(i = j)! = 0', так как' 0' является 'false' – 4castle