栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将字符串作为指针或文字传递时,不一致的strcmp()返回值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将字符串作为指针或文字传递时,不一致的strcmp()返回值

您最有可能看到编译器优化的结果。如果我们使用上godbolt
GCC的测试代码
,以

-O0
优化级别,我们可以看到它不调用第一种情况
strcmp

movl    $-1, %esi   #,movl    $.LC0, %edi #,movl    $0, %eax    #,call    printf  #

由于您使用常量作为strcmp的参数,因此编译器能够执行常量折叠并在编译时调用内在的编译器,

-1
然后生成then,而不必
strcmp
在标准库中实现的运行时调用,并且具有不同的实现则可能是更简单的编译时间
strcmp

在第二种情况下,它的确产生了对的调用

strcmp

call    strcmp  #movl    %eax, %esi  # D.2047,movl    $.LC0, %edi #,movl    $0, %eax    #,call    printf  #

这与gcc内置有strcmp的事实是一致的,这是

gcc
恒定折叠期间将使用的内容。

如果我们使用

-O1
优化级别或更高级别进行
进一步测试,
gcc
则可以折叠两种情况,结果将是
-1
两种情况:

movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #movl    $-1, %esi   #,movl    $.LC0, %edi #,xorl    %eax, %eax  #call    printf  #

通过启用更多优化选项,优化器不仅可以确定

a
b
指向编译时已知的常量,还可以在编译时
strcmp
针对这种情况计算结果。

我们可以

gcc
通过使用-fno-
builtin标志
进行构建并观察
strcmp
在所有情况下都会生成对的调用,从而确认正在使用内置函数。

clang
稍有不同,因为它不会完全折叠,
-O0
但会同时折叠在
-O1
上面和上面。

请注意,任何负面结果都是完全一致的,我们可以通过转到C99标准草案

7.21.4.2
的strcmp函数( 强调我的 )来看到:

int strcmp(const char *s1, const char *s2);

strcmp函数返回一个大于,等于 或小于零 的整数,因此s1指向的字符串大于,等于或 小于 s2指向 的字符串

technosurus指出,将

strcmp
其指定为将字符串视为由 未签名的char 组成,这在C99中已作如下介绍
7.21.1

对于本节中的所有功能,每个字符都应被解释为具有无符号字符类型(因此,每个可能的对象表示形式都是有效的并且具有不同的值)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号