C语言学习第四节-变量、赋值、初始化

2020-03-31 14:36 阅读 186 次 评论 1 条

变量

什么是变量:

变量是程序可操作的存储区的命名……等等,我觉得还是不要再讲这个理论,我也表述不清楚,也自认为即使我表达的非常正确也没什么用,也没必要。讲这个概念起码需要200个字,每一个字我们都认识,但是连起来就不知所云了。所以直接上手写一个看看。

  1. 首先定义/声明这个变量为int类型,int类型是初学时最常用的类型。
    int x;
  2. 那么x是什么呢?
  3. 我们用printf格式化输出一下x的值
    printf(%d\n,x); \n相当于回车键,表示另起一行

    为了方便,我这里用sublime编辑器,直接按Command + B编译并执行。


    得到了一个非常奇怪的数,没有任何规律。再按一次Command + B

    又得到了一个奇怪的数,没有任何规律。这是因为没有给这个变量做赋值/初始化的动作,执行时读到内存的哪个数就是哪个了,所以没有任何规律。所以在声明变量时,先来做一次初始化的动作。

 

初始化/赋值

int x = 10;
/*
或者用这样的写法
int x;
x = 10;
*/

int x = 10; 是在声明变量x的时候就做了初始化(initialization),让x所在的内存位置的值为0。
int x; x = 10;则是声明了变量(variable)x,并且给x做了一次赋值(assignment),让x所在的内存位置的值为0。

变量原理

int a; 表示定义一个变量,而这个变量是int类型的,就是说我在内存中开辟了一个4个字节的空间,用a来表示,这四个字节存储的内容为1010,就是10的二进制代码的补码,后面所有地方用a就可以表示10了。

10进制的1234表示的是1*10^3+2*10^2+3*10^1+4*10^0

2进制的1010转化为10进制表示的是1*2^3+0*2^2+1*2^1+0*2^0=8+0+2+0=10

这个a其实存储在内存中,内存也是分堆、栈等等,那么a会放在栈中,5会放在堆中,而栈中的a有一个链接,是直接链接到堆中的5的这块空间上的。链接的本质就是说,栈中的a存放了堆中的1010的首地址,读取的时候,会从首地址开始,依次读取4个字节即可。

a的类型是int型,a仅仅是个标识符,不是个对象,对象才是有类型的。C语言中是没有对象的,但是可以理解为堆中的东西都是对象,栈中的都是标识符。

这里的等号,与数学算式中的等号不一样。这里的等号并不是算式符号,而是赋值符号。左右两边分别是是左值(lvalues)与右值(rvalues)。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:

int g = 20; //正确,将20这个数字指向G所在的内存位置。

但是下面这个就不是一个有效的语句,会生成编译时错误:

10 = 20; //不正确,没有意义

一个完整的初始化变量示例

#include <stdio.h>
int main()
{
  int x = 12346789; //初始化变量x,初始化值为12346789
  printf("%d\n", x); //便于查看结果
  return 0; //返回值
}

一个完整的对变量赋值示例

#include <stdio.h>
int main()
{
  int x; //声明变量x
  x = 12346789; //把12346789赋给x
  printf("%d\n", x); //便于查看结果
  return 0; //返回值
}

那么对于变量做初始化与声明后赋值有什么区别呢?其实区别也不大,放在汇编里看一下

int a;
a= 100;
0041137E  mov         dword ptr [a],64h 

int b = 100;
00411385  mov         dword ptr [b],64h 

初始化就是定义的时候赋值,生命期开始,赋值是生命期延续。

 

参考文献:

超纲交流:

  1. 有没有哪些更规范的写法,至少在只声明变量而不做初始化/赋值时,不会乱出结果。
  2. 编译器对10 = 20;语句的判断是warning还是error?为什么?

 

上一篇:C语言学习第三节-数据类型

下一篇:C语言学习第五节-表达式、第二个c语言程序

嘤嘤嘤嘤嘤呜呜呜呜呜叭叭叭叭叭嘿嘿嘿嘿嘿哟哟哟哟哟 (6 次评分, 平均分: 4.83 out of 5)
Loading...
版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:C语言学习第四节-变量、赋值、初始化 | 温柔的夜
分类:C语言 标签:

发表评论


表情

  1. laojie
    laojie 【见习观察员】 @回复

    一、int main(int argc, char *argv[])
    二、error:expression isn’tassignable