size_t和int之间的区别是有据可查的,我概括了一下:前者是某些无符号整数类型的别名,它是依赖于实现的,而后者是有符号的; 前者适用于内存声明,而后者适用于算术运算.
我的问题是,如果我做一些算术计算来给int(它永远不会太大而且总是正的)并将它分配给size_t变量(用于访问数组位置),是否存在任何可能出现问题的情况出现?
假设我正在使用using namespace std(不可否认的不良做法)并且我abs在我的代码中使用该函数(以获得重载的绝对函数).具体来说,我的MWE是:
#include <cmath>
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(int argc, char* argv[]) {
double f(-0.4);
std::cout<<"abs(f) = "<<abs(f)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果我注释掉该using namespace std;行,则输出为
abs(f) = 0
Run Code Online (Sandbox Code Playgroud)
否则输出是
abs(f) = 0.4
Run Code Online (Sandbox Code Playgroud)
我不明白的是,在后一种情况下如何调用"正确的"abs函数,因为即使stdlib.h有一个abs只返回int's'的函数.
事实上,这个问题的第二个答案是使用using namespace std;可能还不够.这是真的?我的MWE似乎与此相矛盾.
我在Linux上使用gcc-4.8,这可能是解决依赖关系最有问题的组合.
我有以下简单的程序:
#include <iostream>
#include <stdio.h>
void SomeFunction(int a)
{
std::cout<<"Value in function: a = "<<a<<std::endl;
}
int main(){
size_t a(0);
std::cout<<"Value in main: "<<a-1<<std::endl;
SomeFunction(a-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我得到:
主要价值:18446744073709551615
函数值:a = -1
我想我大致理解为什么函数获得-1的'正确'值:存在从无符号类型到有符号类型的隐式转换,即18446744073709551615(无符号)= -1(有符号).
是否存在函数无法获得"正确"值的情况?