C 语言中"=="的用法的几个问题?

2015-04-02 09:51:28 +08:00
 herozem

先看测试用例:

#include <stdio.h>

int main(int argc, char *argv[])
{
  char *s = "hello";
  char *str = "hello";

  printf("compare pointers: ");
  s == str ? printf("y") : printf("n"); #(1)
  printf("\ncompare arguments: ");
  argv[1] == argv[2] ? printf("y") : printf("n"); #(2)
  printf("\nuse strcmp :");
  strcmp(&argv[1], &argv[2]) ? printf("y") : printf("n"); #(3)

  return 0;
}

运行结果:

$ ./a.out tmp tmp
compare pointers: y
compare arguments: n
use strcmp :y

确切的来说是想解决一些关于C和内存知识的问题:

在代码中, (1)比较的两个字符串, s和str在内存中是不同的指向char的指针, 但是他们指向的内容实际上是同一处?

(2)中比较的内容结果是不相等, "=="号比较的是所给参数的内存地址吗?
(3)的输出结果为y, 所以strcmp比较的是指针所指向的内容?

2003 次点击
所在节点    C
30 条回复
bugeye
2015-04-02 11:28:34 +08:00
@herozem 我觉得如果你读过汇编,就知道C语言实质上是一种可以跨平台的高级宏汇编。所以想搞清楚这些底层的问题,最好是去学汇编。

但是。。。。。按软件业的现状看,还是把时间花在能快速原型,能快点做项目的语言为佳。就算用C语言也没必要搞清楚这些东西,只要记得比较字符串strcmp是正道就行。没必要浪费时间在这些底层细节上。这些细节要想100%搞清楚,得学计算机组成原理了。
herozem
2015-04-02 11:31:33 +08:00
@bugeye 是啊。。所以我觉得到C语言不能再往下了(汇编什么的), 虽然说越往下学对计算机理解的越清楚。。。
hualuogeng
2015-04-02 11:37:00 +08:00
@herozem @bugeye 看你用C语言完成什么样的工作了,如果是偏底层的,了解汇编是有必要的。而如果不是,大多数时候C都不是首选。
@herozem 刚才说的三本书中,学习内存和指针,首选《专家编程》吧。
jemyzhang
2015-04-02 11:46:04 +08:00
编译优化的关系, 优化后s和str被指向同一个地址, 所以s == str成立
ZyZyZzz
2015-04-02 12:32:43 +08:00
@hualuogeng “原文中的3,之所以输出y,是因为还是比较的指针本身的值”
比较的不是俩指针所在的内存地址嘛_(:з」∠)_?

还有这里用VS2010带的编译器编出的s和str指向的地址居然不一样……
hualuogeng
2015-04-02 13:25:51 +08:00
@ZyZyZzz 我们的表述不一致,实际所指是一致的,如你图中所示,实际比较的是692381和692384。

常量的编译优化是编译器实现相关的,标准上没有规定,所以总是认为s和str指向相同的内存的想法是个坑。如你所说,VS2010就和GCC实现不一样。
21grams
2015-04-02 14:13:36 +08:00
第一个是编译器优化的,不能认为永远都成立。
xieyudi1990
2015-04-02 18:26:14 +08:00
@Andiry s 和 str 都是变量.
linux40
2015-04-02 20:01:47 +08:00
char *str = "hello"是不好的习惯。。。至于函数有返回值的,看书吧。。。
chisj
2015-04-03 00:23:24 +08:00
《C和指针》,《C陷进和缺陷》,《C专家编程》,但是这些都不如你撸几个实际项目学的东西来得靠谱。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/181027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX