- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道如果在同一个函数中多次使用 strcmp()
会返回不同的值。下面是程序。第一种情况我知道它为什么打印 -6。但是在第二种情况下,为什么会打印-1呢?
#include<stdio.h>
#include<string.h>
int main()
{
char a[10] = "aa";
char b[10] = "ag";
printf("%d\n",strcmp(a, b));
printf("%d\n",strcmp("aa","ag"));
return 0;
}
它产生的输出如下
[sxxxx@bhlingxxx test]$ gcc -Wall t51.c
[sxxxx@bhlingxxx test]$ ./a.out
-6
-1
为什么第二个strcmp()
的输出是-1?在这里玩的是Compiler吗?如果是这样,它的具体优化是什么?
最佳答案
C standard关于 strcmp
的返回值,说明如下:
第 7.24.4.2p3 节:
The strcmp function returns an integer greater than, equal to, or less than zero, accordingly as the string pointed to by s1 is greater than, equal to, or less than the string pointed to by 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
。
关于c - strcmp 输出之谜 - strcmp 实际上是如何比较字符串的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54710944/
我想知道如果在同一个函数中多次使用 strcmp() 会返回不同的值。下面是程序。第一种情况我知道它为什么打印 -6。但是在第二种情况下,为什么会打印-1呢? #include #include in
所以我们在 PHP 中得到了这个函数 strcmp(string $1,string $2) // returns -1,0, or 1; 然而,我们没有 intcmp();所以我创建了一个: fun
我正在比较用户输入的用户名和密码。正在比较的字符串正在从文件中读入。无论出于何种原因,它都会适当地比较用户名,而不是密码。。控制台输出:
我正在比较用户输入的用户名和密码。正在比较的字符串正在从文件中读入。无论出于何种原因,它都会适当地比较用户名,而不是密码。。控制台输出:
虽然 word 和 s2 相同,但是 if(strcmp) 语句没有被执行。错在哪里??我检查了从文件中读取的代码并尝试了“printf”以查看 word 和 s2 是否相同,发现它们在大约 10 次
是不是只有静态存储类型的变量不会被函数的返回值初始化,因为它们不被认为是常量?根据这个论点,以下声明在 C 中是否有效。它编译时没有错误或警告, 并且输出符合预期。 #include #includ
我必须生成一个反向链表,这些是我的先决条件 定义结构: struct node { int data; struct node * link; } 包含函数 append --- 在链
我是 C 编程的新手。我正在尝试比较两个字符串。我收到错误:此行有多个标记。传递 'strcmp' 的参数 1 使指针来自整数而不进行强制转换。传递 'strcmp' 的参数 2 使指针来自整数而不进
请注意,我已经检查了与此标题相关的问题,但从我的角度来看,它们与此问题无关。 最初我以为 program1 和 program2 会给我相同的结果。 //Program 1 char *a = "ab
你好,我正在使用 fgets 对我的代码进行循环,我希望当用户引入单词 "bye" 时程序结束,所以我有一个像这样的时间: char buf[1000] do{ fgets(buf, 1000
我想了解为什么我的代码会崩溃。我有一个结构数组,如下所示: typedef struct contact { char cFirstName[10]; char cLastName[1
代码: #include #include #include int main() { int n = strcmp("hello","help"); printf("%d\
这个问题在这里已经有了答案: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized po
该程序执行以下操作: 扫描文本字符串char input[15]; 将其与字符密码[ ] = "1sure";进行比较 如果字符串不匹配则循环。 如果字符串匹配则终止。 当字符串不匹配时程序会循环。但
我正在读一本 C 语言的书,并且看过这两个 strcmp 算法。 我已经了解了 for 循环的使用原理。 但这两个for循环对我来说是新的。我不明白这些部分 for (i = 0; s[i] == t
用 gcc C99 编译 我正在尝试使用字符串比较来比较 2 个字符串。但是,我似乎在 strcmp 行上得到了堆栈转储。 **属性将包含这些,所以我正在寻找框架类型。 [name] [time] [
我正在努力填补计算机科学方面的自学空白,并参加 Edx 上的 CS50 类(class)。我对 C 完全陌生。在其中一个问题集中,我必须比较使用 crypt 函数加密的字符串。 在下面的示例中,我无法
谁能解释一下 strcmp 在 C 编程中使用什么算法来比较两个字符串? 我不明白它的返回值,它使用任何算法,如“Levenstien 算法”来找出两个字符串之间的距离... 最佳答案 标准 C 库
我在结构数组 books 上有一个delete 函数。我向它传递了一组记录、书的作者 和书名 以及列表大小。 现在这里 假设 list[0].author 和 list[5].author 和 aut
这个问题已经有答案了: using fgets and strcmp in C [duplicate] (3 个回答) 已关闭 4 年前。 作为初学者,我一直在尝试该库的一些功能 string.h并且
我是一名优秀的程序员,十分优秀!