C语言 还是嵌套
int x = 5, y = 7; void swap ( ) { int z ; z = x ; x = y ; y = z ; } main( ) { int x = 3, y = 8; swap ( ) ; printf ( " %d , %d \n ", x , y ) ; } A) 3 , 8 B) 8 , 3 C) 5 , 7 D) 7 , 5 我算出来的结果是B,但是答案是A,有什么地方算错了么?
这个问题是这样的,x和y变量都是有两个定义,一个是在main函数外的,一个是在main函数里的,而程序去处理这样的二义性的时候只看跟自己最有关系的定义,也就是局部变量的定义,也就说printf ( " %d , %d \n ", x , y ) ;这句话的里的x和y就是指的是main函数里定义局部变量的x=3、y=8,而不是头上定义的全局的x=5、y=7,而且他们从来就没有被再赋值过,所以,理应选A 关于补充,这是关于作用域的问题,一般的作用域就是指一对花括号括起来的代码{} //------全局作用域开始 int x = 5, y = 7; //------作用域1开始 void swap ( ) { int z ; z = x ; x = y ; y = z ; } //------作用域1结束 //------作用域2开始 main( ) { int x = 3, y = 8; //----注1 swap ( ) ; printf ( " %d , %d \n ", x , y ) ; } //------作用域2结束 //------全局作用域结束 很简单,当作用域2里的printf函数打印x,y的时候,它会先找自己作用域是否有定义x,y,有的话就直接用了,如果没有定义,才会去外一层的作用域找已经定义的x,y swap()函数调用后的效果是把全局作用域下定义的x,y的值改变了,因为swap()函数体中(也就是作用域1中),没有定义x,y,所以他会去找上层作用域(全局),从而进行赋值 而printf的时候,main()里(作用域2)已经定义了x,y,所以全局变量里定义的x,y在作用域2里是不可视的,且值也没有改变,所以还是x=3,y=8。
答案是A 没错的!~ 问题的关键在于x和y变量,在程序的最前面的变量声明是全局的,但是在主函数main内,又声明了同名的局部变量。这就涉及到同名的全局和局部变量作用域的问题了。当程序走到局部变量作用域时,全局变量暂时被屏蔽,当离开局部变量的作用域时,同名的全局变量则起作用。 所以,当调用无参的swap()时,已经离开main函数中x,y的作用域,此时交换的变量是全局的x,y。而main函数输出的则是局部变量的x,y值,所以结果是(A) 3 , 8。 最好的检验办法,就是在swap()函数的后面添加:printf("%d,%d\n",x,y);即可看出效果!
swap实现数值互换。x,y为全局变量,main中再次赋值,后进行交换,即swap函数运行,此时x=8,y=3. 从而打印结果为B项
问:听说这个有99%的人会算错,下面一共几个西瓜?来挑战答案是什么
答:因为下面没有西瓜,所以99%的人都会算错了。详情>>
答:读指针用来记录文件当前文件之前的读取位置,它指向下一个将要读取的信息项详情>>
答:到这里下载Visual C++ 的库组件(上方有个“下载”按钮)。 安装后再试。 另,机器的用户名是中文也不行。在控制面板里改中文名为英文名。详情>>