weixin_44206033
coo588
2021-01-16 08:23
采纳率: 50%
浏览 120

C++宏定义字符串,再将宏与相同的引号引起来的字符串“123”比较时,会有问题吗?

【问题描述】

定义宏#define  STR  “123”

假设有语句   if(STR==“123”)

那么编译可以通过吗,会有什么问题吗?

【自我思考】

个人感觉编译可以通过,看到说字符串比较的时候是指针比较,所以比较会有问题。我了解字符串比较有函数strcmp,但是好像又有人说字符串比较是可以用==号的,所以还是有疑问。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • liudachu
    liudachu 2021-01-16 08:33
    已采纳

    比较两个字符串的大du小用strcmp函数,这个函数内是依次比较两个字符串的每个字符,一直到遇到不同的字符或某个字符串的结尾为止。

    而如果ch1 == ch2这样对比的是两个字符串的首地址是否相同,而不是字符串的内容按照字典序的大小。
     

    点赞 评论
  • weixin_44206033
    coo588 2021-01-16 09:19

    我在VS里试了一下,这样写的话可以运行if语句里的内容,说明STR 和“123”首地址是相同的吗?

    点赞 评论
  • include_iostream_
    include_iostream_ 2021-01-16 19:52

    你看到的“C++字符串可以用等号比较”应该指的是std::string而不是C-style string。std::string的确可以用==直接比较,但C-style string是不行的。

    点赞 评论
  • include_iostream_
    include_iostream_ 2021-01-16 19:54

    至于你后来提出的问题,应该涉及C++内存模型。STR会被预编译器替换为宏内容,所以这个if本质上是if("123" == "123")。这种字面值常量字符串会被放在进程的统一区域,程序需要时从对应区域调用,而这里两个字符串相同,很可能会被放在同一个地址上。

    点赞 评论
  • weixin_44206033
    coo588 2021-01-17 09:21

    谢谢大神,感觉清楚了!

    点赞 评论

相关推荐