C++ 中的 if 语句行为真的很奇怪

Posted

技术标签:

【中文标题】C++ 中的 if 语句行为真的很奇怪【英文标题】:Really weird if statement behavior in C++ 【发布时间】:2020-09-23 01:35:50 【问题描述】:

即使两个 if 表达式的计算结果相同,也只打印第一条语句。为什么?

    map <int, int> elem;
    vector <int> nums(2);
    int x = 1;
    elem[x]=-1;
    
    int val = elem[x];

    if(val>nums.size()/3) cout << "First"; // as you can see, vals is -1 and nums.size() is 2
        
    if(-1>2/3) cout<< "Second";

【问题讨论】:

nums.size() 不是int 如果您没有就编译错误寻求帮助,最好确保您的示例代码编译 without warnings。 【参考方案1】:

它们不一样。

if(val > nums.size() / 3) 

问题是num.size() 的类型是size_t,它是无符号的。当您将有符号类型与无符号类型进行比较时,您会得到未定义的行为。

如果你真的想让它一样,那么你需要做一个演员:

if (val > static_cast<int>(nums.size()) / 3)

现在它将类似于您的第二个代码

if(-1 > 2 / 3)

这两者都会导致false,并且您不应该看到任何FirstSecond 打印。

【讨论】:

或:if(-1 &gt; static_cast&lt;size_t&gt;(2) / 3) 这不是未定义的行为,请参阅***.com/questions/5416414/signed-unsigned-comparisons

以上是关于C++ 中的 if 语句行为真的很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js if语句的问题。工作真的很奇怪

具有零值双精度的奇怪 if 语句行为

Laravel 4:刀片布局中的 if 语句很奇怪

switch 语句中的奇怪行为

cfscript中IF块内的coldfusion continue关键字/奇怪的行为

js null undefined 真的等于false吗