在 C++ 中比较两个 std::string 时的未定义行为 [关闭]

Posted

技术标签:

【中文标题】在 C++ 中比较两个 std::string 时的未定义行为 [关闭]【英文标题】:Undefined Behavior While Comparing two std::string in C++ [closed] 【发布时间】:2021-11-05 06:05:09 【问题描述】:

我有一个简单的循环遍历向量的元素并检查该元素是否等于其他字符串。问题是,即使我使用== 比较的两个字符串具有不同的值,if 条件也满足。我已经使用 gdb 确认了这一点。我的代码如下:

for(std::string &curr:myVector)
        
                        
            std::string temp = "Not Value";
            std::cout<<" checking: "<<curr<<" against: "<<temp<<std::endl;
            if(curr == temp)    ;
            
                flag = true;
                std::cout<<"breaking"<<std::endl;
                
               
        

所以假设向量有元素"Value1", "Value2", "Value3"。现在对于每次迭代,即使向量内没有“非值”,if 条件也会得到满足。下面是使用 gdb 的输出:

checking: Value1 against: Not Value
245                         if(curr == temp)    ;
(gdb) p curr
$16 = "Value1"
(gdb) p temp
$17 = "Not Value"
(gdb) n
247                             flag = true;

如您所见,变量currtemp 包含不同的内容,即使这样,if 条件也已满足。使用cout 和使用gdb 都表明变量的内容不同。我在这个程序中做错了什么吗?

PS:我已经多次使用这种方法,直到今天我都没有遇到任何问题,但由于某种原因,这个程序不能正常工作。也许我犯了一些我无法发现的小错误。所以有人可以帮我发现它。

【问题讨论】:

if 很好,但是有了那个杂散的分号,就没有任何条件了。即,花括号之间的部分与if() 语句无关。 未按预期工作!= 未定义。您的代码没有任何未定义的行为。 if ( condition ); 是一个带有空主体的 if 语句,这是很好的定义。投票结束为拼写错误 @Yun 是一个基于花园品种范围的 @463035818_is_not_a_number 谢谢你是正确的。我错过了。 编译器应该发出警告,如果设置正确,代码不会编译:godbolt.org/z/vvr8s9Tdv 【参考方案1】:

您的if 条件为空。 当你写

if(some_condition) ;

    //doing my thing

你只是有一个没有正文的 if 语句。下面的正文只是与if无关的不同范围。

要修复,只需删除 ;

if(some_condition)

    //doing my thing

【讨论】:

以上是关于在 C++ 中比较两个 std::string 时的未定义行为 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

切换基于模板类型 C++ 的引用参数传递

C++ 程序在执行 std::string 分配时总是崩溃

是啥导致 c++ std::string 变量在传递给类时给出冲突的定义

C++ std::string 和字符串

C++ std::string 构造函数

如何在 C++ 中将整个文件读入 std::string?