C语言中关于全局变量的初始化与赋值(查过大量资料后基本搞懂了)

上周例会时学长让写一个合并链表,我本来觉得挺简单的,但是意外发现了一个全局变量的赋值问题。我把链表的头节点的next在函数外赋值为了NULL。(head->next=NULL)然后程序报错,说"‘head’ doesn’t name a type".
于是我查了些资料终于发现了问题。
1赋值与初始化时两个概念:
在《C++ primer》 中,作者专门强调了这一点。
书中的原话时这样的:

初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而已一个新值来替代。

并且,在C++中,初始化的方法有多种:
如`int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);

我在网上百度了为什么不能赋值的问题百度了很久,始终找不到答案,终于在一个老帖在中找到了答案
:一个答主说,赋值是语句,而初始化是在定义中的,而定义和声明不是语句。我终于拨云见日。因为,语句是要再函数中执行的。
然后我找到了《C primer plus》,表达式与语句这一节中语句的定义:

大部分语句都有表达式构成
每个表达式都有值
语句是C程序的基本构件块。一条语句相当于一条完整的计算机指令。在C中,大部分语句都以分号结尾。如:legs = 4只是一个表达式,而legs =4;是一个语句。
;是一个空语句。
8;
9+3;
也是语句,但是这写语句在程序中什么也不做,不算是真正的语句。更确切的说,语句可以改变值或调用函数。
在我多次求证看来:定义是一种是声明,并为变量分配空间,初始化。
而声明是告诉编译器存在一个变量。但是这个变量并不用告诉编译器他在哪。
编译器只需要知道他在就行了。并且一个程序只能对变量定义一次,却可以声明多次。

你可能感兴趣的:(C/C++)