main( int argc ,char*argv[ ] ) {int n,i=0 ; while(argv[ 1 ][ i ]! ='\0' ) {n=fun();i++;}

main( int argc ,char*argv[ ] )
{int n,i=0 ;
while(argv[ 1 ][ i ]! ='\0' )
{n=fun();i++;}
printf(%d\n",n*arge);
}
int fun()
{static int s=0;
s+=1;
return s;
}假设程序经编译连接生成可执行文件exam.exe,若输入exam 123<回车> ,结果为6,为什么?

printf(%d\n",n*arge);中的arge是argc吗?
如果是的话,结果应该是6,输入exam 123<回车>后,参数argc = 2,argv[1] = "123".
因为字符串“123”长度为3,所以argc * n 等于2 * 3 等于6。若exam后没有参数,则argc = 1,
argv[0] = main;追问

参数argc = 2,argv[1] = "123". 这一步是为什么?还有最后S是怎么运算出的?

追答

argc和argv是由系统传递的,argc始终大于或等于1,当exam后无有参数时,argc等于1,有n个参数,argc为n+1,第一个字符串的地址存在argv[1],第二个字符串的地址存在argv[2],依此累推。
s你定义为static静态变量,具有连续性,所以执行一次fun()时,s就累加1,总共执行了3次,所以while循环退出时,s的值为3,n的值也为3

一时大意,之前的回答中argv[0] = main;是错的,应该是argv[0] 指向程序运行的全路径名

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-14
局部静态变量的值只能够被初始化一次,并且生命周期是和整个程序一样的,也就是说s在被第一次初始化0后,以后每调用一次函数fun,s都自增1,并且不再被另外初始化。所以最后s的值为3

也就是n值为3,

如果程序中的arge没有错的话,程序是编译不通过的,如果是argc的话,就没有问题了,因为你在命令提示行里面,输入了两个字符串,一个是exam, 另外一个是123所以argv[0]="exam",argv[1]="123",而参数argc所接收的是参数的个数,也就是2,所以最终结果

n*argc=3*2=6
第2个回答  2011-08-14
因为 s是静态变量 s只有在主程序结束后s的内存才会释放,所以s的值是每次累加的结果 输入123输入了三个字符 那么fun()函数被调用了三次。则s的值为3,则n的值为3,而arge就是i值,输入1时i为0,输入2时,i为1,输入3时,i为2。arge=2;则最后n*arge为6
第3个回答  2019-09-10
argv[1]
=
"2"
argv[2]
=
"45"
argv[3]
=
"678"
而argv[i]是字符串数组的头指针,指向第一个字符,因此
argv[1]
-
'0'
=
2
argv[2]
-
'0'
=
4
argv[3]
-
'0'
=
6
程序结果当然就是246了
相似回答