为了账号安全,请及时绑定邮箱和手机立即绑定

127、以下叙述中不正确的是____

127、以下叙述中不正确的是____

C
包小龙虾 2018-09-08 23:20:25
A) 在不同的函数中可以使用相同名字的变量 B) 函数中的形式参数是局部变量 C) 在一个函数内定义的变量只在本函数范围内有效 D) 在一个函数内的复合语句中定义的变量在本函数范围内有效
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

你细想一下:你在前面回复中的说法和题目中 C 选项是一样的逻辑。如我在前面回答中指出的,我觉得 C 选项的说法是不严谨的。

我再多说一些吧:

首先“有效”这个词就不严谨,C 语言中没有一个叫作“有效”的概念。

C 语言的标识符(或者我们简化一下,就看作是变量名)有个叫“作用域”的概念(这个你肯定知道)

C 语言的对象(或者我们就看作是变量名所代表的实际变量)有个叫“生存期”的概念(我想这个你至少也听说过)

我不知道你有没有区分过这两个概念?   或者你会不会觉得我说的这两个概念难道不是一回事吗? 标识符、对象、变量这三个名词难道不是一回事吗?  我们不是常说“变量的作用域”、“变量的生存期”吗......   它们当然不一样。 事实上 C 语言中并没有真正定义“变量”这个名词。


先说说“标识符”和“对象”吧:

如我前面所说,在题目提到的情形中,所谓“标识符”其实就是变量名(注意是名字),而“对象”指的就是变量名所代表的“东西”(抱歉这里我不能用“变量”一词)   我不是在咬文嚼字,细想一下,它们的含义确实是有区别的。下面用代码举些例子


int a;   这是非常简单的语句,我们常说这是“声明(也是定义)了 int 变量 a”。

其实严谨的解说是:a 这个名字就是标识符,a 所代表的是一个 int 对象。 注意:我并没有用“变量”一词,这个词更像是一种笼统的俗称。  必须要说“变量”一词并不是错误的称呼,在不需要明确区分标识符和对象时,我们当然可以说这是“声明(也是定义)了 int 变量 a”。


而下面的代码就需要区分标识符和对象了:

{
    ...
    int a;
    
    for (;;) {  // 这里是不是 for 语句并不重要,重要的是这对大括号构成的语句块
        double a;
    }
}

这段代码中存在两个对象:int 型的和 double 型的,但只有一个标识符 a

前面说过,标识符有个叫“作用域”的概念,它表示这个名字的“可见”范围。而对象有个叫“生存期”的概念,它表示对象实际占用存储空间的存续期,或者说在哪个范围内对象是存在的。关键是作用域和生存期的范围不一样:

  • 标识符作用域的范围是从声明处起,至所在语句块结尾处止。

  • 对象生存期的范围是从在语句块起始处起,至所在语句块结尾处止。

那么,第 3 行的标识符 a 的作用域是从第 3 行到第 8 行大括号结尾。在这个范围内 a 这个名字就表示这里定义的 int 对象。通俗的说法就是“变量 a 在这个范围内可见,在范围外不可见”。

而这个 int 对象的生存期是从第 1 行的大括号起,到第 8 行大括号为止。在这个范围内 int 对象实际存在。

仔细看上面这两句话你会发现,在第 2 行处,int 对象也存在?  是的,这个位置在对象的生存期内,这时 int 对象已经实际占用了内存。 但是其名字 a 并不可见? 没错,在这时你还不能通过 a 这个名字来使用 int 对象。  这也就是你再熟悉不过的那个通俗地说法“变量在声明之后才可以使用”。

对于第 6 行。标识符 a 在一个新的语句块中,a 这个名字会“隐藏掉”块外的同名。这里的 a 具有新的作用域,从第 6 行到第 7 行。也就是在这个范围内提到 a 这个名字,指的就是第 6 行的 double 对象了。 同理,double 对象的生存期是从第 5 行的大括号到第 7 行。

所以“变量”这个通俗的名词在不同的语境下可能描述的是不同的概念。比如:

  • 我说“第 3 行的 int 变量 a 在第 2 行无效”,其实描述的是“第 3 行的标识符 a 的作用域”

  • 我说“第 7 行之后 double 变量 a 就无效了”,其实描述的可能是“double 对象的生存期”



说回到本题

从文字中我感觉得题目中的对“变量有效性”的探讨指的是“标识符的作用域”。

C 选项中的“本函数范围”一词十分模糊。我不知道它的意思是“本函数的整个范围”,还是仅仅粗略地表示“在本函数范围内就算”。   因为标识符的作用域是从声明处开始的,肯定不是“函数的整个范围”。  如果认为这句话是粗略的说法,那还可以认为 C 选项是正确的。

D 选项的说法肯定是错误的。甚至即便题目中的“变量”指的是“对象的生存期”,D 也是错误的。


但你说答案是 C?!  这就怪了。

如果认为 C 的意思是“函数整个范围”,那 C 就算是错误的。但别忘了 D 也是错误的呀!   假若认为题目的“变量”指的是“生存期”,那 C 的说法反而是正确的了...

所以说...这题目又错了吧...



P.S. 如果这是单选题,那我强烈地感觉答案应该是 D。毕竟 D 的说法怎么样都是错误的。我可以把 C 看作是种粗略的说法而将其认为是正确的。

查看完整回答
反对 回复 2018-09-10
  • 包小龙虾
    包小龙虾
    嗯嗯,好的,我明白了,谢谢大神,辛苦啦!???
  • 1 回答
  • 1 关注
  • 1454 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信