Стандарт C говорит следующее относительно возвращаемого значения strcmp
:
Раздел 7.24.4.2p3:
Функция strcmp возвращаетцелое число больше, равно или меньше нуля, соответственно, поскольку строка, на которую указывает s1, больше, равна или меньше, чем строка, на которую указывает s2
Так что до тех пор, покарезультат соответствует описанию, соответствует стандарту C.Это означает, что компилятор может выполнить оптимизацию для соответствия этому определению.
Если мы посмотрим на код сборки:
.loc 1 7 0
leaq -32(%rbp), %rdx
leaq -48(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call strcmp
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
.loc 1 8 0
movl $-1, %esi # result of strcmp is precomputed!
movl $.LC0, %edi
movl $0, %eax
call printf
В первом случае массивы передаются в strcmp
для вызована strcmp
и вызов на printf
генерируется.Однако во втором случае строковые константы передаются обоим.Компилятор видит это и генерирует сам результат, оптимизируя фактический вызов strcmp
, и передает жестко закодированное значение -1 в printf
.