所以我正在编写一个接受int的程序,并返回与表示int的位有关的内容。但是,当我在命令行中放入一个int并立即将其打印出来时,它会打印出来。
为什么会发生这种情况,我该如何解决?
〜。/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
}
答案 0 :(得分:3)
参数传递不会像您认为的那样工作。
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]
为空指针。如果要将第一个命令行参数用作数字,则必须使用argv[1]
或std::istringstream
或类似内容来解析atoi
,如
#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 ++标准下工作,但它可能会在所有平台上发生,就像在你的平台上一样。