从零开始学C语言(二)

一.标识符,常量,变量

标识符

以字母或下划线开头的下划线字母数字的组合,例如a;_a;a1;_1;_a1。
但是不能出现运算符,例如a+b;a*b这种
简单的理解就是变量的名字的命名规则
注意不要用汉字作为变量名,也不要用汉语拼音(同音字太多容易混乱),少用无意义的字母如a,b,c(例如当设置一个求和变量时尽量使用sum这种变量名便于理解代码作用)

变量

变量就是以某标识符为名字,其数值可以改变(可读,可写)(可读指可以读取它的数值)(可写指可以给他赋值)

常量

常量的数值不可改变(可读,不可写

二.定义、声明

1.定义

所谓定义就是为这个变量分配一块内存并给它取上一个名字,这个名字就是变量名。
注意,名字一旦和内存匹配起来,它们就同生共死,终生不离不弃,并且这块内存的位置也不能被改变。一个变量在一定区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象

2.声明

声明有两重含义
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了。
第二重含义:告诉编译器,这个名字先预定了,别的地方再也不能用它来作为变量名

记住,定义和声明最重要的区别:定义创建了对象并为这个对象分配了一块内存,而声明的时候是没有分配内存空间的。

三.补充说明

1.不存在某个量的设定是不可读的,因为没有意义,同时无法判断出这样的量是否存在,举个例子
一般程序里给定一个值,

int main()
{
int  a=10;//int为变量类型,a为标识符变量名,10为字面常量
return 0;
}

(1.1)
程序分析
定义了一个int类型的变量a同时给a赋予了一个值为10。
假设a不可读,那么首先无法用printf语句将它的值输出,其次也无法通过c=a+2;if(a),这些语句变相调用,因为a的设定是计算机无法读取数值,所以a不能被识别为10,所以用不了。
实际上当你用以上语句定义出一个合法的(符合标识符命名规则的变量)并通过任意方式赋值,它都是可以通过某一输出语句,输出其值的,常见的就是printf语句(可能有别的,但我现在想不起来了)。

2.赋值不是覆盖
int a=10;
不是用10将a覆盖,一个int类型占4字节,a是这片4字节空间的名字,赋值10是将10放入给这片空间内部。

3.局部变量、全局变量、块内变量
全局变量:函数之外定义的变量
局部变量:函数内定义的变量
块内变量:函数内用{}形成一个块,在块内定义的变量为块内变量
例如(3.1)

#include<stdio.h>
int GlobalVariable=10;//全局变量
int main()
{
int LocalVariable=20 ;//局部变量
   {
   int BlockVariable=30;//块内变量
   }
   return 0;
}

(3.1)

#include<stdio.h>
int firstvariable=10;//定义一个全局变量firstvariable赋值为10
void fun()
{ 
int x=firstvariable;//定义一个局部变量x,将firstvariable的值赋给x
int blind=3//定义一个局部变量blind
}
int firstvariable=20;// 与全局变量firstvariable冲突,多次定义firstvariable,**编译器不会通过**
int main()
{
int x=10;//定义一个局部变量x,与fun函数内的局部变量x不冲突
int y=firstvariable;//定义一个局部变量y,将firstvariable值赋给y
int c=blind;//定义一个局部变量c将blind赋给c,**但此处编译不通过**
    {
    int z=30;//定义一个块内变量z,赋值为30
    }
return 0;
}

(3.2)
程序分析
由于编译器编译是从上往下一行一行读,所以第一行的firstvariable=10;先被编译器读取,全局变量从它定义(声明)的那一行往下都可见,
例如在第一行定义的firstvariable,,在下面的fun函数和main函数内都可用,当在全局域中第二次出现firstvariable的定义时编译器会报错,因为重复定义,
在fun函数中定义的局部变量x和blind只在函数内有效,所以当在main函数中再定义一个变量x时不会报错,但当试图将fun函数中的blind的值调出来赋给main中的c变量时,会报错,因为blind是局部变量,离开了fun函数,系统不知道blind是什么东西,
块内变量z同理

#include<stdio.h>
int firstvariable=10;
int main()
{int a=firstvariable;
int firstvariable=20;
int c=firstvariable;
int d=::firstvariable;

printf("a=%d c=%d d=%d \n",a,c,d);
return 0;
}

(3.3)
程序分析
当全局变量名和局部变量名发生冲突的时候,采取向上就近的原则(我的看法是,因为编译器是从上向下读取的,所以使用最新的一次对firstvariable的定义来运行,但是同时要注意全局域内不能重复定义全局变量,函数内也不能重复定义两个局部变量),但如果想要在重名的局部变量后用到全局变量firstvariable的值,需要在firstvariable前加上::(作用域运算符)来表示用的是全局变量

运算

必要的术语解释

1.操作数是程序操作的数据实体,该数据可以说数值,逻辑值或其他类型。该操作数既可以是常量也可以是变量。

2.运算符是可以对数据进行相应操作的符号。如对数据求和操作,可以用加法运算符“+”,求积操作可以使用乘法运算符“*”等。
根据运算符可操作的操作数的个数,可把运算符分为一元运算符(单目运算符)、二元运算符(双目运算符)和多元运算符(C语言只有一个三元运算符(?:),三目运算符。)这个三目运算符,我没啥印象,想起来了回来再补。

注意运算符的实际用法目前需要注意的易错运算符是‘=’这个符号的意思是将‘=’右边的值赋给左边,例如(1.1)中a=10;是将10之歌值赋给a,当输出用整数型输出a时会输出10,如果想将a取其他值,只需要再用’='赋予新值就好,同时c=a+b;c=a+2;这种语句也都是赋值运算符的使用,作为等号在表示判断左右两边相等的这种功能则用 ==来表示,例如if(a == 12);while( a ==b)两种用法一个是在赋值一个是逻辑上的相等

c语言提供了丰富的运算符
有:算数运算符、关系运算符、逻辑运算符、赋值运算符、移位运算符、逗号运算符及sizeof运算符。
对应有:算数表达式、关系表达式、逻辑表达式、赋值表达式、移位表达式、sizeof表达式等

3.左值和右值
当说到一个操作数具有左值时意味着这个值可写可读,而当说一个操作数只具有右值时意味着可读不可写
举个例子
在这里插入图片描述

10是一个常量,当试图将a的值赋给10时,会报错,尽管a被赋值为10,因为常量可读不可写,和左值的设定不符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值