所以我正在写一个程序,它接收一个int,并返回一些与表示int的位有关的信息。然而,当我在命令行中放入一个int并立即将其打印出来时,它会打印2。
为什么会发生这种情况,我该如何解决?
~/a.out 8
我只能为main输入一个参数:
#include<iostream>
#include<cstdlib>
using namespace std;
void foo (int ii, int x){
static int p;
k= x<<ii;
.
.
}
int main(int x) {
cout << x << endl;
.
.
.
return 0
}
参数传递的工作方式不像您认为的那样。
main
恰好有两个签名可以保证工作:
int main()
和
int main(int argc, char *argv[])
后者是您在分析命令行参数时使用的。这里argc
是参数计数,即传递的参数数(包括命令本身的名称)和argv
的长度。argv
是一个包含参数的C样式字符串数组。
所以,当你打电话给时
./a.out 8
则argc
是2,argv[0]
是"./a.out"
,argv[1]
是"8"
,并且argv[2]
是空指针。如果您想将第一个命令行参数用作数字,则必须使用std::istringstream
或atoi
或类似内容来解析argv[1]
,如中所示
#include <iostream>
#include <sstream>
int main(int argc, char *argv[]) {
if(argc < 2) {
std::cerr << "No argument was given.n";
return -1;
}
std::istringstream parser(argv[1]);
int x;
if(parser >> x) {
std::cout << x << " * 2 = " << x * 2 << 'n';
} else {
std::cerr << "The argument was not a number.n";
return -2;
}
}
顺便说一句,因为这不是你可以依赖的东西,这也解释了为什么你会得到输出2
。当你写
int main(int x) {
x
取argc
的值,而本来应该是argv
的内容被忽略,这是由于与跳转到main
之前在内存中布置参数的方式有关的低级原因。当使用./a.out 8
调用程序时,该值为2,因此x
在代码中为2。C++标准不能保证这一点,但它很可能在所有平台上都会发生,就像在您的平台上一样。