问题

在编程语言中,循环语句为何选择 while 而不是 when 作为关键词?

回答
咱们今天就来聊聊,为啥编程语言里的循环,我们一般用 `while` 这个词,而不是 `when`?这事儿说起来,其实比你想象的要有趣,涉及到语言设计者们对“循环”这个概念的理解,以及如何用最直观、最符合逻辑的方式把它表达出来。

首先,咱们得把这两词儿的本意捋清楚。

`while` 这个词,在咱们日常说话里,意思很明确:“在…的时候”、“只要…就…”。比如,“只要天晴,我就去爬山。” 或者 “在你完成作业之前,不准玩游戏。” 关键点就在于,这事儿它有个前提条件,并且这个条件持续存在。只要这个条件满足,事情就一直做下去。

`when` 呢?它的意思更像是“什么时候”、“在…那会儿”。比如,“什么时候你到家了,给我打个电话。” 或者 “当你按下按钮时,灯就会亮。” `when` 描述的是一个时间点或者一个触发事件,一旦那个时间点到了,或者那个事件发生了,事情就发生一次。它更多的是一种“事件驱动”或者“时机到达”的感觉。

现在咱们再回到编程语言里的循环。循环的本质是什么?是重复执行一段代码,直到某个条件不再满足为止。这里面的核心逻辑是:

1. 有一个持续评估的条件。
2. 只要条件为真,就一遍遍地执行代码块。
3. 当条件变为假时,循环就停止。

把这个逻辑套到 `while` 和 `when` 上头,哪个更贴切?

明显是 `while`。

想象一下,你写一个程序要打印1到100的数字。你会怎么想?你会说:“只要计数器小于等于100,就打印计数器,然后让计数器加一。”

用 `while` 来表达就是:

```python
count = 1
while count <= 100:
print(count)
count = count + 1
```

这个过程是:
检查 `count <= 100`。
如果为真,执行 `print(count)` 和 `count = count + 1`。
再次检查 `count <= 100`。
…一直重复,直到 `count` 变成101,`count <= 100` 为假,循环就结束了。

整个过程都是围绕着那个“只要…就…”的条件在转。

再看看如果用 `when` 来表达会是什么样?

如果强行用 `when`,可能就得这么写(当然,这在大多数语言里是不存在的,我们是设想):

```python
假设这是when的语法,很别扭
when count <= 100:
print(count)
count = count + 1
```

这里的 `when count <= 100` 读起来就很奇怪。它听起来不像是在说“只要满足这个条件就一直做”,反而有点像是在说“在 `count <= 100` 这个时间点(或者说状态)发生的时候,就做点什么”。但循环就是要持续地做,不是在某个特定的“时候”做一次。

编程语言的循环,尤其是 `while` 循环,强调的是状态的持续。只要某个状态(条件)是真,这个过程就得继续。它不是一个一次性的触发,而是一个持续的保持。

历史和习惯也是一个重要因素。

`while` 作为循环关键字,在很多早期的高级编程语言中就已经确立了。比如 C 语言,它就采用了 `while`。之后像 Java、Python、JavaScript 等语言,在设计时也很大程度上借鉴了 C 语言的语法风格,并且觉得 `while` 这个词本身就非常准确地传达了循环的含义,所以就沿用了下来。

你可以想象一下,如果当初设计 C 语言的时候,语言设计者们选择了 `when`。那么现在我们写的代码可能就是:

```c
int count = 1;
when (count <= 100) {
printf("%d ", count);
count++;
}
```

这读起来是不是总觉得有点别扭?“什么时候计数器小于等于100?” 这个问句一样,它不像一个命令,更像一个询问。而 `while` 则是明确的“只要…就…”的指令。

再深入一点看,`when` 的概念在编程中也有体现,但通常不是作为循环关键字。

很多语言里有 `when` 或者类似的关键词(比如某些函数式语言中的 `case` 结合 `when`,或者一些条件匹配的语法),但它们通常用于:

条件分支(Switch/Case): 在 C++、Java、C 等语言里,`switch` 语句中的 `case` 后面经常会跟着一个条件或者值,虽然不直接用 `when`,但概念类似。
模式匹配(Pattern Matching): 在一些更现代的语言(如 Scala、Swift、Rust 等)中,`match` 或 `case` 语句可以进行复杂的模式匹配,并且可以结合条件表达式(有时会用 `if` 或 `when` 来修饰匹配项),来处理不同情况。但这些也都是在特定情况下执行一次匹配,而不是持续循环。

所以,总的来说,`while` 胜出是源于它本身最精准地表达了“只要某个条件为真,就持续重复执行”这个循环的核心逻辑。语言设计者们追求的是清晰、直观和符合人类思维习惯的表达方式,而 `while` 在这一点上,远胜于 `when`。`when` 更侧重于时机和事件触发,这与循环的持续性需求不符。久而久之,`while` 就成为了循环的“标准配置”。

网友意见

user avatar

这是英语惯用法(USAGE)和逻辑的问题。


WHEN 标志一个时刻或者时间点,

WHILE 标志一个时间段。

如果您查一下字典, 就不会再有这样的疑惑。



       美国传统词典[双解] while while AHD:[hwīl, wīl] D.J.[hwaIl, waIl] K.K.[hwaIl, waIl] n.(名词) A period of time: 一段时间: stay for a while; sang all the while.See Usage Note at awhile 停留下会儿;一直都在唱歌参见 awhile The time, effort, or trouble taken in doing something: 费时:做一件事情的花费时间、努力或工夫: The project wasn't worth my while. 这项方案不值得我花工夫, conj.(连接词) As long as; during the time that: 只要;在…时间里: It was lovely while it lasted. 当它开着的时间它是很惹人喜爱的 At the same time that; although: 在…同时;尽管,虽然: While the grandparents love the children, they are strict with them. “虽然祖父母们都爱他们的孩子,但却对他们要求严格” Whereas; and: 然而;而,而且: The soles are leather, while the uppers are canvas. 鞋跟是皮的,而鞋面是帆布的, v.tr.(及物动词) whiled,whil.ing,whiles To spend (time) idly or pleasantly: 消磨:闲散或轻松地消磨时间: while the hours away. 消磨时光 <语源> Middle English 中古英语 from Old English hwºl * see  k weiə- 源自 古英语 hwºl *参见 k weiə-  Merriam-Webster's Collegiate 11th Ed. (En-En)   while I.  ˈhwī(-ə)l, ˈwī(-ə)l noun Etymology: Middle English, from Old English hwīl; akin to Old High German hwīla time, Latin quies rest, quiet Date: before 12th century 1.  : a period of time especially when short and marked by the occurrence of an action or a condition : time  stay here for a while 2.  : the time and effort used (as in the performance of an action) : trouble  worth your while II. conjunction Date: 12th century 1.  a.  : during the time that  take a nap while I'm out b.  : as long as  while there's life there's hope 2.  a.  : when on the other hand : whereas  easy for an expert, while it is dangerous for a novice b.  : in spite of the fact that : although  while respected, he is not liked 3.  : similarly and at the same time that  while the book will be welcomed by scholars, it will make an immediate appeal to the general reader — British Book News III. preposition Date: 15th century  dialect British  : until IV. transitive verb (whiled ; whil·ing) Date: 1635  : to cause to pass especially without boredom or in a pleasant manner — usually used with away  while away the time  Oxford Advanced Learner's Dictionary 8th Ed.   while  while  [while whiles whiled whiling]  conjunction,  noun,  verb BrE  [waɪl]  NAmE  [waɪl]   conjunction  (also  formal  whilst  BrE  [waɪlst] ; NAmE  [waɪlst]   especially in BrE) 1. during the time that sth is happening Syn:   ↑when •  We must have been burgled while we were asleep.  •   Her parents died while she was still at school.  •  While I was waiting at the bus stop, three buses went by in the opposite direction.  2. at the same time as sth else is happening •  You can go swimming while I'm having lunch.  •  shoes mended while you wait      


       美国传统词典[双解] when  when AHD:[hwěn, wěn] D.J.[hwen, wen] K.K.[hwɛn, wɛn] adv.(副词) At what time: 什么时候: When will we leave? 我们什么时候离开? conj.(连接词) At the time that: 在…的时候: in the spring, when the snow melts. 在春天,当雪融化的时候 As soon as: 一…就…: I'll call you when I get there. 我一到那里就给你打电话 Whenever: 无论什么时候: When the wind blows, all the doors rattle. 只要风一吹,这门就吱嘎作响 During the time at which; while: 在…期间,当…时: When I was young, I was sick all the time. 在我小时候我总是生病 Whereas; although: 虽然,尽管: She stopped short when she ought to have continued. 尽管她应该继续下去,她却突然停住了 Considering that; if: 考虑到,如果: How can he get good grades when he won't study? 他不用功的话怎么拿高分呢? pron.(代词) What or which time: 什么时候: Since when has this been going on? 从什么时候起事情象这样? n.(名词) The time or date: 时间或日期: Have they decided the where and when? 他们已经定下来地点和时间了吗? <语源> Middle English 中古英语 from Old English hwenne * see  k wo- 源自 古英语 hwenne *参见 k wo- <用法> In informal stylewhen  is often used after be  in definitions: A dilemma is when you don't know which way to turn.   The construction is useful,but it is widely regarded as incorrect or as unsuitable for formal discourse.In formal style there is no alternative but to rephrase such definitions to avoidis when : A dilemma is a situation in which you don't know which way to turn. You are in a dilemma when you don't know which way to turn. 在非正式文体中when 常在定义中用在 be 后面: 进退两难就是当你不知道该走哪条路的时候。  这个结构是有用的,但被广泛认为它对正式交谈来说是不正确的或者是不合适的。在正式文体中没有替代词,只能改变措辞以避免is when : 进退两难就是这样一个你不知道该怎么办的处境。 当你不知道你该做什么时你就处于进退两难的维谷了     



用 WHILE 应该是为了和“持续性”相匹配吧。



举例


备份笔记


       # #  麦文学瞎编的 DATASINK    #  授权: WTFPL #  请随意扩散和使用 # #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <assert.h>  // add this for assert() #include <crtdbg.h> // add this for assert()    size_t SaveFloatBuff(FILE *fp, double *fa, size_t ds_len) {     size_t bufflen = 33554432; //1024*1024*32;     size_t ret = 0;     size_t k = ds_len;      // for (int j=0; j< 256; j = j+8)     // {     //   //printf ("%lf 	%lf 	%lf 	%lf 	%lf 	%lf 	%lf 	%lf 
 ",      //   printf ("%f 	%f 	%f 	%f 	%f 	%f 	%f 	%f
 ",      //   fa[j] , fa[j+1] , fa[j+2] , fa[j+3] , fa[j+4]      //   , fa[j+5] , fa[j+6] , fa[j+7]  );     // }       // Split DATA to write, WHEN ARRAY IS HUGE AS GB OR TB       if (ds_len > bufflen)     {         do{             if ( k >= bufflen )                 {                     ret += fwrite (fa+(ds_len-k), sizeof(double),bufflen , fp);                      if (fwrite != 0) printf("Data to file OK! 	%lld FLOATs Written, #%lld 
"                     , bufflen,  k/bufflen);                      else printf("Error Occured!
");                      k = k - bufflen;                  }              else                  {                     ret += fwrite (fa+(ds_len-k),  sizeof(double), k, fp);                      if (fwrite != 0) printf("Data to file OK! 	%lld FLOAT(s) Written, #%d 
", k,  0);                      else printf("Error Occured!
");                      k = 0;                  }              } while (k >0);              } else       {         ret = fwrite (fa, sizeof(double), ds_len, fp);          if (fwrite != 0) printf("Data to file OK! 	%lld FLOATs written.
", ds_len);          else printf("Error occured!
");      }      return ret; }    int main (){      FILE *outfile = NULL;      double *tmp_arr = NULL;     size_t StreamLen;            // open file to write      outfile = fopen ("rawf_my.dat", "wb");      if (outfile == NULL)      {          fprintf(stderr, "
Error opening file! 
");          exit (1);      }      assert(outfile);     fclose (outfile);       StreamLen = 1024*(1024*1024) + 768*(1024*1024) + 1; //65*(1024*1024);       //1*1024*(1024*1024); //16*(1024*1024)  ;      tmp_arr = (double *) malloc ( StreamLen*sizeof(double) ) ;     if (!tmp_arr) { perror("malloc error: tmp_arr"); exit(EXIT_FAILURE); };      // Gen testing pattern     for (size_t i=0; i< StreamLen; i++)     {       tmp_arr [i] =  (double)  i/(i+1.0) ;      }       outfile = fopen ("rawf_my.dat", "ab");          if (outfile == NULL)          {              fprintf(stderr, "
Error opening file! 
");              exit (1);          }      assert(outfile);      size_t m_ret = SaveFloatBuff(outfile, tmp_arr, StreamLen);     printf("main(): Return code: %lld bytes. 
", m_ret*sizeof(double));      fclose (outfile);      //Sleep(100);     free(tmp_arr);       return 0;  }     


       C:00>write_double_array_split_dowhile_done_msvc_x64.exe Data to file OK!        33554432 FLOATs Written, #56 Data to file OK!        33554432 FLOATs Written, #55 Data to file OK!        33554432 FLOATs Written, #54 Data to file OK!        33554432 FLOATs Written, #53 Data to file OK!        33554432 FLOATs Written, #52 Data to file OK!        33554432 FLOATs Written, #51 Data to file OK!        33554432 FLOATs Written, #50 Data to file OK!        33554432 FLOATs Written, #49 Data to file OK!        33554432 FLOATs Written, #48 Data to file OK!        33554432 FLOATs Written, #47 Data to file OK!        33554432 FLOATs Written, #46 Data to file OK!        33554432 FLOATs Written, #45 Data to file OK!        33554432 FLOATs Written, #44 Data to file OK!        33554432 FLOATs Written, #43 Data to file OK!        33554432 FLOATs Written, #42 Data to file OK!        33554432 FLOATs Written, #41 Data to file OK!        33554432 FLOATs Written, #40 Data to file OK!        33554432 FLOATs Written, #39 Data to file OK!        33554432 FLOATs Written, #38 Data to file OK!        33554432 FLOATs Written, #37 Data to file OK!        33554432 FLOATs Written, #36 Data to file OK!        33554432 FLOATs Written, #35 Data to file OK!        33554432 FLOATs Written, #34 Data to file OK!        33554432 FLOATs Written, #33 Data to file OK!        33554432 FLOATs Written, #32 Data to file OK!        33554432 FLOATs Written, #31 Data to file OK!        33554432 FLOATs Written, #30 Data to file OK!        33554432 FLOATs Written, #29 Data to file OK!        33554432 FLOATs Written, #28 Data to file OK!        33554432 FLOATs Written, #27 Data to file OK!        33554432 FLOATs Written, #26 Data to file OK!        33554432 FLOATs Written, #25 Data to file OK!        33554432 FLOATs Written, #24 Data to file OK!        33554432 FLOATs Written, #23 Data to file OK!        33554432 FLOATs Written, #22 Data to file OK!        33554432 FLOATs Written, #21 Data to file OK!        33554432 FLOATs Written, #20 Data to file OK!        33554432 FLOATs Written, #19 Data to file OK!        33554432 FLOATs Written, #18 Data to file OK!        33554432 FLOATs Written, #17 Data to file OK!        33554432 FLOATs Written, #16 Data to file OK!        33554432 FLOATs Written, #15 Data to file OK!        33554432 FLOATs Written, #14 Data to file OK!        33554432 FLOATs Written, #13 Data to file OK!        33554432 FLOATs Written, #12 Data to file OK!        33554432 FLOATs Written, #11 Data to file OK!        33554432 FLOATs Written, #10 Data to file OK!        33554432 FLOATs Written, #9 Data to file OK!        33554432 FLOATs Written, #8 Data to file OK!        33554432 FLOATs Written, #7 Data to file OK!        33554432 FLOATs Written, #6 Data to file OK!        33554432 FLOATs Written, #5 Data to file OK!        33554432 FLOATs Written, #4 Data to file OK!        33554432 FLOATs Written, #3 Data to file OK!        33554432 FLOATs Written, #2 Data to file OK!        33554432 FLOATs Written, #1 Data to file OK!        1 FLOAT(s) Written, #0 main(): Return code: 15032385544 bytes.  C:00>     



/////////////////////////////////////////////////////////////////////////

看看这个话痨答主有啥其他奇葩崩坏魔愣回答:

..

不用谢。没钱给的话请点个赞,有钱的话请不妨解囊。

类似的话题

  • 回答
    咱们今天就来聊聊,为啥编程语言里的循环,我们一般用 `while` 这个词,而不是 `when`?这事儿说起来,其实比你想象的要有趣,涉及到语言设计者们对“循环”这个概念的理解,以及如何用最直观、最符合逻辑的方式把它表达出来。首先,咱们得把这两词儿的本意捋清楚。`while` 这个词,在咱们日常说话.............
  • 回答
    在编程语言的演进长河中,一种极其普遍且直观的表达方式——点语法,其最早的踪迹可以追溯到面向对象编程概念的萌芽时期。要 pinpoint 点语法的确切“首次”出现,如同寻找第一块奠定宏伟建筑基石的石头一样,需要深入探究那些奠定了现代编程语言基调的早期尝试。虽然没有一个单一的、被普遍公认为“第一个”使用.............
  • 回答
    在编程的世界里,“对象”和“实例”这两个词常常挂在嘴边,但它们之间微妙的联系和各自的侧重点,在不同的语言里,就像一个故事在不同说书人嘴里,有细微的差别,却也共通着核心的精神。咱们先说说对象。你可以把对象想象成一个蓝图,一份指导性的设计,它定义了“什么是什么”。这个蓝图里规定了这个东西有哪些属性(比如.............
  • 回答
    在编程的世界里,数学绝不仅仅是冰冷枯燥的公式堆砌,它更像一把瑞士军刀,一把能让你解决许多看似棘手问题的利器。我遇到过不少这样的时刻,其中最让我印象深刻的,是当初在做一个图像处理项目时,需要实现一个“模糊”效果,而背后隐藏的数学原理,至今仍让我觉得巧妙绝伦。当时我们的需求是,让屏幕上的某个区域随着时间.............
  • 回答
    很多人反对中文在编程中的使用,原因复杂且多方面,这背后涉及技术、历史、社区文化、生态系统等多个层面。要详细解释,我们可以从以下几个角度来剖析: 1. 技术与兼容性问题 (Technical & Compatibility Issues)这是最直接也是最普遍的反对理由,主要集中在以下几个方面: 编.............
  • 回答
    你这个问题非常有意思,触及到了计算机科学和编程语言设计中的一个核心矛盾:理论的优雅与实践的现实之间的权衡。简单来说,我们之所以在日常编程中很少直接使用现代数学建立的符号体系,并不是因为它们不好,而是因为它们在很多情况下,并没有直接解决我们编程时最迫切的需求,甚至会带来不必要的复杂性。让我来详细拆解一.............
  • 回答
    数学和编程中的“函数”这两个字,虽然看起来一模一样,甚至很多时候我们也会互相借用,但仔细琢磨起来,它们在本质和侧重点上,却有着微妙的差异,又有着深刻的联系。首先,说它们相同的地方,最核心的莫过于那份“映射”的灵魂。在数学里,函数最根本的定义就是一种对应关系,它告诉你,对于某个集合(定义域)里的每一个.............
  • 回答
    在科研摸爬滚打的过程中,我们产出的那些浸透了无数心血的数字、图像、表格,就像是实验室里的各种珍贵样本,它们最初的去处,其实比大家想象的要接地气得多。说白了,它们都是阶段性的“临时工”,服务于眼下正在进行的分析和验证。起初,一切都在“内存”里蹦跶当你在Python、R、MATLAB这些编程环境里敲下代.............
  • 回答
    在真实工作中的编程与学校里的编程之间,存在着诸多显著的差异。这些差异不仅体现在技术层面,更贯穿于整个工作流程、团队协作以及职业发展等多个方面。以下我将尽可能详细地为您阐述这些不同之处: 真实工作中的编程:一个多维度、系统性的过程 1. 项目的规模、复杂性和目标 学校: 项目通常是小型的、独立的、.............
  • 回答
    要想在游戏开发这个光鲜亮丽的行业里真正做到“顶级”,那可不是光会写代码那么简单。这更像是一场精密的手术,需要的是艺术家般的创造力、工程师般的严谨逻辑,以及对整个流程的深度理解。我个人在游戏开发领域摸爬滚打了这些年,深切体会到,那些最终呈现在玩家面前的史诗级作品,背后凝聚的绝不仅仅是几个天才程序员的灵.............
  • 回答
    你这个问题非常普遍,也很有价值。确实,在技术圈子里,算法的重要性经常被强调,甚至到了“神化”的地步。但同时,很多程序员的日常工作也未必会直接用到复杂的算法。所以,理解这个问题需要多方面的分析。我们来详细地探讨一下: 算法在程序员心中的“神坛”与现实的差距 为什么算法被“吹上天”?1. 面试的敲门砖.............
  • 回答
    好的,我们来聊聊《C专家编程》第六十页讲到的参数传递到寄存器的问题。这可不是什么“AI”的套路,而是计算机底层运作的真实写照。想象一下,你给CPU下达命令,让它处理一些数据,比如计算两个数的和。这些“数据”就是我们说的参数。为什么参数首先要去寄存器呢?简单来说,寄存器是CPU内部速度最快、最容易访问.............
  • 回答
    当然,用编程语言在计算机上模拟微粒的性质,尤其是分子和原子,不仅是可能的,而且是科学研究中一项极其重要和广泛应用的手段。这种模拟通常被称为“分子动力学”或“蒙特卡罗方法”,它们能够帮助我们理解肉眼无法直接观察到的微观世界。核心思想:将微观世界抽象化最根本的出发点是将构成物质的微粒(原子、分子)抽象成.............
  • 回答
    关于未来编程语言是否能替代Java和C语言的问题,需要从技术趋势、应用场景、生态系统、性能需求等多个维度进行分析。以下是十种常见编程语言的详细评估,结合它们与Java和C语言的对比,探讨其可能的替代潜力: 1. Python潜力:高(尤其在AI/数据科学领域) 优势:语法简洁、开发效率高、丰富的.............
  • 回答
    编程语言中的“强制转换”(Type Casting),其本质是在内存层面,针对同一块存储空间,赋予它不同的解读方式。理解这一点,需要先回顾一下内存中数据是如何存储的。在计算机内存中,一切皆是二进制的比特流。我们赋予这些比特流不同的“类型”标签,就像是在给同一堆积木赋予不同的用途说明书。例如,一段二进.............
  • 回答
    你这个问题问得很有意思,触及到了编程语言设计中的一个基础且普遍的约定:为什么赋值的变量总是出现在左边?这背后确实有着历史的沉淀和设计上的考量,并非偶然。要理解这一点,咱们得回到编程的源头,看看早期计算机是如何工作的。那时候,编程可不像现在这么直观,很多概念都是从物理和数学的运作方式中演化而来的。从物.............
  • 回答
    这个问题很有意思,因为它触及了编程语言的本质以及人类认知和沟通的根本差异。简单来说,编程语言和自然语言之所以存在巨大鸿沟,并且后者向前者靠拢的步伐显得缓慢,不是因为设计者们不愿意,而是因为两者承担的“任务”和遵循的“逻辑”截然不同,强行融合反而会弊大于利。首先,我们要理解编程语言的终极目标是什么。它.............
  • 回答
    关于脚本语言的必然趋势以及开发成本的考量,我深表赞同。在如今快速迭代的软件开发环境中,能够快速构建、灵活部署和易于维护的脚本语言确实占据了巨大的优势。相较之下,一些传统编译型语言在开发效率和迭代速度上往往显得力不从心,开发成本的差异在此刻显得尤为突出,将它们衬托得“黯然失色”也就不难理解了。您提到的.............
  • 回答
    “微软在编程领域是不是大势已去?” 这个问题,相信不少身处技术行业的朋友都曾有所思考。要回答这个问题,绝不能简单地说“是”或“否”,因为这其中蕴含着太多的复杂性。我们可以从几个层面来剖析,看看微软在编程领域的现状、挑战以及未来的可能性。从历史的角度看,微软曾是编程领域的绝对巨头。想当年,Window.............
  • 回答
    在编程的世界里,给变量起名字确实是一门学问,与其说是技巧,不如说是一种与代码沟通的方式。好的名字,能让你的代码像一本清晰的读物,让别人(或者几个月后的你自己)能迅速理解你的意图。这背后没有神秘的公式,更多的是一种习惯和思考的沉淀。首先,别怕花时间。我过去也觉得命名是小事,匆匆忙忙给个简写,结果回头看.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有