gpt4 book ai didi

c - strcmp() 的不明确行为

转载 作者:行者123 更新时间:2023-12-05 01:29:22 26 4
gpt4 key购买 nike

请注意,我已经检查了与此标题相关的问题,但从我的角度来看,它们与此问题无关。

最初我以为 program1 和 program2 会给我相同的结果。

//Program 1

char *a = "abcd";
char *b = "efgh";
printf("%d", strcmp(a,b));


//Output: -4

//Program 2
printf("%d", strcmp("abcd", "efgh"));

//Output: -1

我能发现的唯一区别是,在 program2 中我传递了字符串文字,而在程序中我传递了 char * 作为 strcmp() 的参数> 功能。

为什么这些看似相同的程序在行为上存在差异?

平台:Linux mint编译器:g++

编辑:实际上 program1 总是打印第一个不匹配字符的 ascii 码的差异,但是如果 string2 中第一个不匹配字符的 ascii 码大于 string1 的 ascii 码,则 program2 打印 -1 ,反之亦然.

最佳答案

这是你的 C 代码:

int x1()
{
char *a = "abcd";
char *b = "efgh";
printf("%d", strcmp(a,b));
}

int x2()
{
printf("%d", strcmp("abcd", "efgh"));
}

这是为两个函数生成的汇编输出:

.LC0:
.string "abcd"
.LC1:
.string "efgh"
.LC2:
.string "%d"
x1:
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
mov QWORD PTR [rbp-16], OFFSET FLAT:.LC1
mov rdx, QWORD PTR [rbp-16]
mov rax, QWORD PTR [rbp-8]
mov rsi, rdx
mov rdi, rax
call strcmp // the strcmp function is actually called
mov esi, eax
mov edi, OFFSET FLAT:.LC2
mov eax, 0
call printf
nop
leave
ret

x2:
push rbp
mov rbp, rsp
mov esi, -1 // strcmp is never called, the compiler
// knows what the result will be and it just
// uses -1
mov edi, OFFSET FLAT:.LC2
mov eax, 0
call printf
nop
pop rbp
ret

当编译器看到 strcmp("abcd", "efgh") 它预先知道结果,因为它知道 "abcd""之前efgh”

但是,如果它看到 strcmp(a,b),它并不知道,因此生成的代码实际上调用了 strcmp

使用另一个编译器或使用不同的编译器设置,情况可能会有所不同。至少在初学者的水平上,您真的不应该关心这些细节。

关于c - strcmp() 的不明确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60306258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com