作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] 无法在function外assign数值给全域变数
时间Fri Mar 16 09:34:06 2018
开发平台(Platform):Windows
Compiler: XC8; MPLAB X IDE
问题(Question):无法在function外assign value给global variable
错误结果(Wrong Output):https://imgur.com/a/PQJU8
程式码(Code):https://ideone.com/IHzqq8
补充说明(Supplement):在GCC环境,是可以成功被编译的
我记得
int x = 3;
int x;
x = 3;
这两个行为对编译器来说是不一样的,但我不知道要喂甚麽关键字给google。
上网查都查不到原因,请大大帮小弟解惑一下Q_Q
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.26.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1521164050.A.84D.html
1F:→ loveflames: x=3为啥可以写在函数外面 03/16 09:40
2F:→ zzss2003: 为什麽不行?已经declare过了不是吗~ 03/16 10:04
3F:→ Lipraxde: x=3放在外面,那你想什麽时候去执行呢? 03/16 10:06
4F:→ jerryh001: 全域只能宣告 03/16 10:42
5F:推 CoNsTaR: 帮二楼翻译,只要宣告过的变数都可以在函数外面使用 03/16 11:03
6F:推 b0920075: 如果单纯问int x = 3和x = 3,一个是initial 一个是assi 03/16 11:05
7F:→ b0920075: gn……的样子,c++做operator overloading才分比较细… 03/16 11:05
8F:→ b0920075: 吧 03/16 11:05
恩...所以我好奇的是为什麽assignment放在函式外面在XC8无法被编译成功,但在GCC却可
以,是因为一个是嵌入式系统,一个是PC的关系吗?
※ 编辑: zzss2003 (60.248.26.157), 03/16/2018 11:59:20
9F:推 legendmtg: 因为你写的不是script language啊 03/16 12:01
10F:→ F04E: 拜托... 这段程式的行为是 宣告一个全域整数变数x并采用预设 03/16 12:26
11F:→ F04E: 初期化(0),接着又隐式宣告一个整数变数x并以3为初始化值 03/16 12:29
12F:→ F04E: 也就是说你宣告了两个x,然後第一个x被第二个盖掉 03/16 12:30
13F:→ F04E: 因为C允许这种行为,你用C++编肯定会错 03/16 12:31
14F:→ F04E: 并不是GCC允许变数在函式外执行好吗 03/16 12:33
15F:推 boss0405: 楼上正解,第二个i会被预设成int,gcc也会报warning 03/16 12:38
16F:→ boss0405: 第二个x... 03/16 12:39
17F:推 boss0405: 查了一下C89可以这样用,C99就拿掉了,不过可能部分 03/16 12:42
18F:→ boss0405: compiler仍然支援,但是会报warning 03/16 12:42
谢谢F大,精明
※ 编辑: zzss2003 (60.248.26.157), 03/16/2018 14:32:25
19F:推 dzwei: 补充b0920075, 03/16 15:00
20F:→ dzwei: int a = 0严格说起来应该说 03/16 15:00
21F:→ dzwei: assignment init, 03/16 15:00
22F:→ dzwei: int a(0)才是所谓init 03/16 15:00
23F:→ dzwei: (类似constructor) 03/16 15:00
24F:→ dzwei: 如果在c++ 03/16 15:00
25F:→ dzwei: 又是物件的话, 03/16 15:00
26F:→ dzwei: explicit 就有差了 03/16 15:00
27F:→ F04E: 说实在,对於内建型别而言,=跟()初始化只有意识形态的不同 03/16 15:13
28F:→ F04E: 对使用者自订型别才需要严格注意区别 03/16 15:14