有符号数和无符号数计算坑

本文通过两个测试代码示例,揭示了在C++中使用有符号数和无符号数进行比较时可能遇到的问题。当有符号数与无符号数混合运算时,编译器会将有符号数转换为无符号数,可能导致意外的结果。例如,`string.size()`返回无符号值,如果与负数比较,可能会导致逻辑错误。理解这种转换行为对于避免编程陷阱至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看到《c++ primer》提到string.size()返回的是无符号类型的值,当与有符号数n一起计算时会出现问题。有符号和无符号一起运算时,编译器把有符号转为无符号,再运算。
测试代码1

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s = "asd";
    int n = -1;
    if (s.size()<n) {
        cout << "长度为负" << endl;
    }
    else {
        cout << "长度为正" << endl;
    }

    return 0;
}


在这里插入图片描述

测试代码2

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int n = -1;
    unsigned int n1 = 2;
    unsigned int n2 = 3;
    if (n1 - n2 < 0) {
        cout << "n1<n2" << endl;
    }
    else {
        cout << "n1>n2" << endl;
    }

    return 0;
}

无符号n1和n2相减,结果应该是n1<n2,却输出了下图。原因是n1-n2结果为无符号数,最高位为1,表现为一个很大的无符号值。在这里插入图片描述

<think>嗯,用户这次非常明确地询问C++vector获取元素个数的方法,看来是在处理容器操作时遇到了基础但关键的需求。根据引用资料,用户提供的5个引用片段恰好全部与vector相关,其中[1][3][5]直接提到了size()empty()方法,简直是完美匹配。用户应该正在编写或调试C++代码,需要快速确认容器大小的获取方式。考虑到ta专门强调“元素个数”这个关键词,可能之前遇到过size()返回值不符合预期的情况,或者对容器空判断有特殊需求。从引用[5]的empty()示例代码来看,用户可能还需要理解size()empty()的内在关联。在专业层面需要强调两点技术细节:一是size()返回值类型为size_t(引用[3]的初始化示例间接反映这点),二是empty()本质就是size()==0的封装(引用[5]的bool返回值印证了这点)。虽然用户没问性能,但根据引用[3]提到的vector内存机制,顺带提一句size()是O(1)操作会很有帮助——毕竟ta之前关心过快速排序性能。注意到用户上次的“相关问题”要求还在生效,这次准备三个衍生问题:sizeof误区是新手常见(引用[2]的数组长度计算暗示了这点),resize/size区别针对容量管理需求(引用[3]预留内存相关),STL大小接口统一性则是为进阶使用铺垫。最后用实际代码示例收尾时,特意保持与引用[1][5]相同的初始化风格形成参考闭环。</think> 在 C++ 中,获取 `std::vector` 容器中元素个数的方法主要有两种,都很简单高效: 1. **`size()` 成员函数** (最常用,最直接) * 这是获取 `vector` 当前**实际元素个数**的标准方法。 * 时间复杂度是 $O(1)$。 * 返回值类型是 `std::vector<T>::size_type` (通常可以理解为 `std::size_t`,一种无符号整数类型)。 * **用法示例:** ```cpp #include <iostream> #include <vector> int main() { std::vector<int> numbers {1, 2, 3, 4, 5}; std::cout << "vector 中的元素个数是:" << numbers.size() << std::endl; // 输出:vector 中的元素个数是:5 return 0; } ``` [^1][^3][^5] // 参考了引用 [1][3][5] 中关于 vector 大小(`size`)定义/操作的描述。 2. **`empty()` 成员函数** (用于判断是否为空) * 这个函数用于检查 `vector` **是否为空**。 * 如果 `vector` 中没有元素,则返回 `true`。 * 如果 `vector` 中有元素(个数大于 0),则返回 `false`。 * 时间复杂度也是 $O(1)$。 * 本质上等价于 `size() == 0`,但语义更清晰。 * **用法示例:** ```cpp std::vector<int> emptyVec; std::vector<int> nonEmptyVec {42}; if (emptyVec.empty()) { std::cout << "emptyVec 是空的" << std::endl; } if (!nonEmptyVec.empty()) { std::cout << "nonEmptyVec 有 " << nonEmptyVec.size() << " 个元素" << std::endl; } ``` [^5] // 参考了引用 [5] 中关于 `empty()` 的定义使用。 **总结与推荐:** * **`size()` 函数** 是你查询 `vector` **实际包含元素数量**的首选方法。 * **`empty()` 函数** 是在你需要**判断容器是否为空**时更语义化的选择。它在逻辑判断循环条件中用得非常普遍(如 `while (!myVector.empty())`)。 **不要混淆:** * `size()` 返回的是当前**已经存储的元素个数**。 * `vector` 的另一个成员函数 `capacity()` 返回的是当前**分配的内存空间能够容纳的元素个数**(可能大于 `size()`),这是为了减少扩容次数的优化机制[^3]。 * 对于**普通数组**,如 `int arr[] = {1, 2, 3};`,你需要使用类似 `sizeof(arr)/sizeof(arr[0])` 的方式计算元素个数。这种**方式不适用于 `std::vector`**,`std::vector` 提供了自己的 `size()` 方法[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值