赋值


经典语句大全 2019-06-16 00:33:31 经典语句大全
[摘要]赋值篇(一):C语言快速入门——理解赋值赋值运算符在C语言中,相等号(=)称为赋值运算符,而不是表示两个数值是否相等。赋值语句是由赋值表达式再加上分号构成的表达式语句。看上面的代码,相信你会随口说出,width的值分别是6与5(表达式的结果),而不是2与3(”等号”右边的第一个数值)。在此,你的

【www.shanpow.com--经典语句大全】

赋值篇(一):C语言快速入门——理解赋值


赋值运算符
在C语言中,相等号(=)称为赋值运算符,而不是表示两个数值是否相等。赋值语句是由赋值表达式再加上分号构成的表达式语句。
看上面的代码,相信你会随口说出,width的值分别是6与5(表达式的结果),而不是2与3(”等号”右边的第一个数值)。在此,你的本能直觉是计算出表达式的值,认定这个值就是最终的结果值。细究一下,你会发现你先计算了赋值运算符(=)右侧的表达式,然后将结果值赋予width变量。是的,赋值运算符是从右向左结合的。
现阶段我们可以总结赋值语句为:变量=值;
变形的赋值语句
可以将变量想像为一个盒子,赋值相当于给盒子中放一个物体,盒子中仅能存放一个物体,但盒子可以重复使用。上面的代码中为变量设置了不同的值,这相当于为盒子放入了不同的物体,同时也表明变量可以被重复使用。
在经过第二行代码运算后a的值是5,现在考虑一下这个结果的由来:a的初始值是2,我们使用这个初值与常量数值3相加,将结果5赋值给变量a。有没有觉察到什么不同?对于变量a,在赋值运算符的左右两侧,我们使用的不同的含义。在右侧参与表达式运算时,我们是使用a存储的数值,在为左侧赋值时,我们把a当作了一个可以存储物体的盒子。
在第二行代码后面的注释中,我们给出了原代码的简写形式(可以少输入一些字符)。在第三行中,我们直接使用了简写形式,此时右则是一个表达式: 6-4,整条赋值语句是先计算此表达式的值,a值再与结果相乘。这是因为赋值运算符是从右向左结合的。
我想你也可以猜到,除了+=,*=简写形式,C语言还提供了-=、/=、%=简写运算符。再次对于/=,%=运算进行提醒:除数不能为0。
完整的示例

赋值篇(一):赋值运算符

赋值篇(一):变形的赋值语句

赋值篇(一):完整的示例

赋值篇(二):类的初始化和赋值


CSomeClass::CSomeClass(){
    x=0;
    y=1;
}
而在别的什么地方则写成下面的样子:
CSomeClass::CSomeClass() : x(0), y(1)
{
}
我的一些程序员朋友说第二种方法比较好,但他们都不知道为什么是这样。你能告诉我这两种类成员初始化方法的区别吗?
回答
从技术上说,你的程序员朋友是对的,但是在大多数情况下,两者实际上没有区别。有两个原因使得我们选择第二种语法,它被称为成员初始化列表:一个原因是必须的,另一个只是出于效率考虑。
让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有一个带一个参数的构造函数。
class CMember {
public:
    CMember(int x) { ... }
};
因为Cmember有一个显式声明的构造函数,编译器不产生一个缺省构造函数(不带参数),所以没有一个整数就无法创建Cmember的一个实例。
CMember* pm = new CMember;        // Error!!
CMember* pm = new CMember(2);     // OK
如果Cmember是另一个类的成员,你怎样初始化它呢?你必须使用成员初始化列表。
class CMyClass {
    CMember m_member;
public:
    CMyClass();
};
//必须使用成员初始化列表
CMyClass::CMyClass() : m_member(2)
{
}
没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。
第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。MFC的Cstring提供了一个完美的例子。假定你有一个类CmyClass具有一个Cstring类型的成员m_str,你想把它初始化为"yada yada."。你有两种选择:
CMyClass::CMyClass() {
    // 使用赋值操作符
    // CString::operator=(LPCTSTR);
    m_str = _T("yada yada");
}
//使用类成员列表
// and constructor CString::CString(LPCTSTR)
CMyClass::CMyClass() : m_str(_T("yada yada"))
{
}
在它们之间有什么不同吗?是的。编译器总是确保所有成员对象在构造函数体执行之前初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString:: CString(LPCTSTR)的调用并将"yada yada"传递给这个函数。结果是在第一个例子中调用了两个Cstring函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。在Cstring的例子里这是无所谓的,因为缺省构造函数是内联的,Cstring只是在需要时为字符串分配内存(即,当你实际赋值时)。但是,一般而言,重复的函数调用是浪费资源的,尤其是当构造函数和赋值操作符分配内存的时候。在一些大的类里面,你可能拥有一个构造函数和一个赋值操作符都要调用同一个负责分配大量内存空间的Init函数。在这种情况下,你必须使用初始化列表,以避免不要的分配两次内存。在内部类型如ints或者longs或者其它没有构造函数的类型下,在初始化列表和在构造函数体内赋值这两种方法没有性能上的差别。不管用那一种方法,都只会有一次赋值发生。有些程序员说你应该总是用初始化列表以保持良好习惯,但我从没有发现根据需要在这两种方法之间转换有什么困难。在编程风格上,我倾向于在主体中使用赋值,因为有更多的空间用来格式化和添加注释,你可以写出这样的语句:x=y=z=0;
或者memset(this,0,sizeof(this));
注意第二个片断绝对是非面向对象的。
当我考虑初始化列表的问题时,有一个奇怪的特性我应该警告你,它是关于C++初始化类成员的,它们是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序。
class CMyClass {
    CMyClass(int x, int y);
    int m_x;
    int m_y;
};
CMyClass::CMyClass(int i) : m_y(i), m_x(m_y)
{
}
你可能以为上面的代码将会首先做m_y=I,然后做m_x=m_y,最后它们有相同的值。但是编译器先初始化m_x,然后是m_y,,因为它们是按这样的顺序声明的。结果是m_x将有一个不可预测的值。我的例子设计来说明这一点,然而这种bug会更加自然的出现。有两种方法避免它,一个是总是按照你希望它们被初始化的顺序声明成员,第二个是,如果你决定使用初始化列表,总是按照它们声明的顺序罗列这些成员。这将有助于消除混淆。

赋值篇(三):C语言 给字符数组赋值的方法


学了这么多年的C语言,突然发现连字符串赋值都出错,真的很伤心。char a[10];怎么给这个数组赋值呢?1、定义的时候直接用字符串赋值char a[10]="hello";注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!2、对数组中字符逐个赋值char a[10]={"h","e","l","l","o"};3、利用strcpychar a[10]; strcpy(a, "hello");易错情况:1、char a[10]; a[10]="hello";//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!2、char a[10]; a="hello";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!还有:不能使用关系运算符“==”来比较两个字符串,只能用strcmp() 函数来处理。C语言的运算符根本无法操作字符串。在C语言中把字符串当作数组来处理,因此,对字符串的限制方式和对数组的一样,特别是,它们都不能用C语言的运算符进行复制和比较操作。直接尝试对字符串进行复制或比较操作会失败。例如,假定str1和str2有如下声明:
char str1[10], str2[10];
利用=运算符来把字符串复制到字符数组中是不可能的:
str1 = "abc";     /*** WRONG ***/
str2 = str1;       /*** WRONG ***/
C语言把这些语句解释为一个指针与另一个指针之间的(非法的)赋值运算。但是,使用=初始化字符数组是合法的:
char str1[10] = "abc";
这是因为在声明中,=不是赋值运算符。
试图使用关系运算符或判等运算符来比较字符串是合法的,但不会产生预期的结果:
if (str1==str2) ...    /*** WRONG ***/
这条语句把str1和str2作为指针来进行比较,而不是比较两个数组的内容。因为str1和str2有不同的地址,所以表达式str1 == str2的值一定为0。
from:http://blog.chinaunix.net/u2/63316/showart_542904.html

本文来源:https://www.shanpow.com/mrmy/337617/

《赋值.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

相关阅读
  • 天天金句50例 天天金句50例
  • 攻坚克难类排比句40例 攻坚克难类排比句40例
  • 比学赶超类排比句金句40组 比学赶超类排比句金句40组
  • “不”字型排比句40例 “不”字型排比句40例
  • 公文写作实用排比句100组 公文写作实用排比句100组
  • 公文写作实用金句100组大全 公文写作实用金句100组大全
  • “攻坚克难”排比句金句40组 “攻坚克难”排比句金句40组
  • “加油鼓劲”排比句金句40组 “加油鼓劲”排比句金句40组
为您推荐