user-0 提问: 请教下，为什么应该将变量b定义在变量a的前面？

回复:
user: user-1
content: 能问出这是样的问题，说明确实是经过思考的了。 有的版本的编译器不支持int a = b;这样写，不管b有没有定义在a前面。这是一个具体编译器实现技术的问题。 建议LZ可以看一下编译原理的知识。

user: user-2
content: 引用 13 楼 sholber 的回复:[quote=引用 2 楼 user-10 的回复:] 先定义后使用 引用 3 楼 starytx 的回复:因为编译到int a = b;的时候编译器不认识b是啥 引用 8 楼 worldy 的回复:int a = b;//因为要用到b，但此时b还没定义，会出错，因此b应该先定义     int b = 20;     double 2b = 1.55;//还能这样定义，lz神人也 引用 9 楼 zhangxiangDavaid 的回复:这是变量名字查找规则：C的名字查找规则是这样的，从名字出现处到名字所处的作用域的起始处，这一段进行查找。找到即不再查找，找不到就跳到上一层作用域继续查找。 所以无法找到b的声明，报错 引用 12 楼 xmnathan 的回复:int a = b; 你赋值给a一个还未存在的变量肯定不行啊 所以要先定义b  不定义就不能使用吗？我不这么认为。你们试试复合字面值： (int) {0} = 3; 如果你们认为它是变量，那么请先给变量下个定义。[/quote]  这个是傻？火星语言？不懂

user: user-3
content: 引用 13 楼 sholber 的回复:[quote=引用 2 楼 user-10 的回复:] 先定义后使用 引用 3 楼 starytx 的回复:因为编译到int a = b;的时候编译器不认识b是啥 引用 8 楼 worldy 的回复:int a = b;//因为要用到b，但此时b还没定义，会出错，因此b应该先定义     int b = 20;     double 2b = 1.55;//还能这样定义，lz神人也 引用 9 楼 zhangxiangDavaid 的回复:这是变量名字查找规则：C的名字查找规则是这样的，从名字出现处到名字所处的作用域的起始处，这一段进行查找。找到即不再查找，找不到就跳到上一层作用域继续查找。 所以无法找到b的声明，报错 引用 12 楼 xmnathan 的回复:int a = b; 你赋值给a一个还未存在的变量肯定不行啊 所以要先定义b  不定义就不能使用吗？我不这么认为。你们试试复合字面值： (int) {0} = 3; 如果你们认为它是变量，那么请先给变量下个定义。[/quote] 不要偷换概念吧 类比楼主的问题 3是变量么？需要定义么？

user: user-4
content: 引用 2 楼 user-10 的回复:先定义后使用 引用 3 楼 starytx 的回复:因为编译到int a = b;的时候编译器不认识b是啥 引用 8 楼 worldy 的回复:int a = b;//因为要用到b，但此时b还没定义，会出错，因此b应该先定义     int b = 20;     double 2b = 1.55;//还能这样定义，lz神人也 引用 9 楼 zhangxiangDavaid 的回复:这是变量名字查找规则：C的名字查找规则是这样的，从名字出现处到名字所处的作用域的起始处，这一段进行查找。找到即不再查找，找不到就跳到上一层作用域继续查找。 所以无法找到b的声明，报错 引用 12 楼 xmnathan 的回复:int a = b; 你赋值给a一个还未存在的变量肯定不行啊 所以要先定义b  不定义就不能使用吗？我不这么认为。你们试试复合字面值： (int) {0} = 3; 如果你们认为它是变量，那么请先给变量下个定义。

user: user-3
content: int a = b; 你赋值给a一个还未存在的变量肯定不行啊 所以要先定义b

user: user-5
content: 规定

user: user-6
content: 唉……来学习了，我只能说越简单的问题越难回答 还是等大神来从编译器、寄存器角度来解释吧。。

user: user-4
content: 引用 14 楼 xmnathan 的回复:[quote=引用 13 楼 sholber 的回复:] [quote=引用 2 楼 user-10 的回复:] 先定义后使用 引用 3 楼 starytx 的回复:因为编译到int a = b;的时候编译器不认识b是啥 引用 8 楼 worldy 的回复:int a = b;//因为要用到b，但此时b还没定义，会出错，因此b应该先定义     int b = 20;     double 2b = 1.55;//还能这样定义，lz神人也 引用 9 楼 zhangxiangDavaid 的回复:这是变量名字查找规则：C的名字查找规则是这样的，从名字出现处到名字所处的作用域的起始处，这一段进行查找。找到即不再查找，找不到就跳到上一层作用域继续查找。 所以无法找到b的声明，报错 引用 12 楼 xmnathan 的回复:int a = b; 你赋值给a一个还未存在的变量肯定不行啊 所以要先定义b  不定义就不能使用吗？我不这么认为。你们试试复合字面值： (int) {0} = 3; 如果你们认为它是变量，那么请先给变量下个定义。[/quote] 不要偷换概念吧 类比楼主的问题 3是变量么？需要定义么？[/quote] 1，在没搞清楚什么是变量前，不要谈定义不定义； 2，你将变量的定义告诉我，我给你举一个反例。

user: user-4
content: 引用 15 楼 worldy 的回复:[quote=引用 13 楼 sholber 的回复:] [quote=引用 2 楼 user-10 的回复:] 先定义后使用 引用 3 楼 starytx 的回复:因为编译到int a = b;的时候编译器不认识b是啥 引用 8 楼 worldy 的回复:int a = b;//因为要用到b，但此时b还没定义，会出错，因此b应该先定义     int b = 20;     double 2b = 1.55;//还能这样定义，lz神人也 引用 9 楼 zhangxiangDavaid 的回复:这是变量名字查找规则：C的名字查找规则是这样的，从名字出现处到名字所处的作用域的起始处，这一段进行查找。找到即不再查找，找不到就跳到上一层作用域继续查找。 所以无法找到b的声明，报错 引用 12 楼 xmnathan 的回复:int a = b; 你赋值给a一个还未存在的变量肯定不行啊 所以要先定义b  不定义就不能使用吗？我不这么认为。你们试试复合字面值： (int) {0} = 3; 如果你们认为它是变量，那么请先给变量下个定义。[/quote]  这个是傻？火星语言？不懂[/quote] 世界上最尴尬的事，就是以为别人说的是火星文，等明白过来，才发现自己已经OUT。搜索一下复合字面值。

user: user-2
content: int a = b;//因为要用到b，但此时b还没定义，会出错，因此b应该先定义     int b = 20;     double 2b = 1.55;//还能这样定义，lz神人也

user: user-7
content: 这是变量名字查找规则：C的名字查找规则是这样的，从名字出现处到名字所处的作用域的起始处，这一段进行查找。找到即不再查找，找不到就跳到上一层作用域继续查找。 所以无法找到b的声明，报错

user: user-4
content: 引用 5 楼 starytx 的回复:[quote=引用 4 楼 sholber 的回复:] [quote=引用 3 楼 starytx 的回复:] 因为编译到int a = b;的时候编译器不认识b是啥 那为什么在a出现之前，goto a就认识呢？：     goto a;     int i = 0; a:     /* …… */[/quote]标签的作用域和普通变量不同，他的作用域是在最近的整个大括号内，所以可以这样使用，普通变量是从定义开始到大括号结束[/quote] 全是最近的大括号……你这个说法不精确啊： goto a; { a:; } 这是可以的。说明标号具有函数作用域，而不是最近的大括号。 变量之类的，这个“从定义开始”也不精确： int * * p (int, int) = /* …… */; 到底是从哪里开始呢？从int后面？从**后面？从p后面？从初始化器后面？

user: user-8
content: 这个a不是变量，是标号。

user: user-9
content: 引用 4 楼 sholber 的回复:[quote=引用 3 楼 starytx 的回复:] 因为编译到int a = b;的时候编译器不认识b是啥 那为什么在a出现之前，goto a就认识呢？：     goto a;     int i = 0; a:     /* …… */[/quote]标签的作用域和普通变量不同，他的作用域是在最近的整个大括号内，所以可以这样使用，普通变量是从定义开始到大括号结束

user: user-4
content: 引用 3 楼 starytx 的回复:因为编译到int a = b;的时候编译器不认识b是啥 那为什么在a出现之前，goto a就认识呢？：     goto a;     int i = 0; a:     /* …… */

user: user-9
content: 因为编译到int a = b;的时候编译器不认识b是啥

user: user-10
content: 先定义后使用

user: user-4
content: 简单地说的话，就是对象和函数类型的标识符必须在使用前加以说明；如果要复杂地说的话，和作用域的开始位置有关，你不能在作用域之外引用一个标识符。在这里，标识符b的作用域开始于它在声明时，其声明符完全出现之后： int main () {      int a = b;      int b/* b的作用域从这里开始 */ = 20;      /* …… */ }