賦值運(yùn)算符
在C語言中丧没,相等號(=)稱為賦值運(yùn)算符,而不是表示兩個數(shù)值是否相等票灰。賦值語句是由賦值表達(dá)式再加上分號構(gòu)成的表達(dá)式語句待锈。
int width = 2 * 3; /* width的值是多少? */
width = 3 + 2; /* 此時width的值又是多少? */
看上面的代碼,相信你會隨口說出贫悄,width的值分別是6與5(表達(dá)的結(jié)果)瑞驱,而不是2與3("等號"右邊的第一個數(shù)值)。在此窄坦,你的本能直覺是計(jì)算出表達(dá)式的值唤反,認(rèn)定這個值就是最終的結(jié)果值。細(xì)究一下鸭津,你會發(fā)現(xiàn)你先計(jì)算了賦值運(yùn)算符(=)右側(cè)的表達(dá)式彤侍,然后將結(jié)果值賦予width變量。是的逆趋,賦值運(yùn)算符是從右向左結(jié)合的拥刻。
現(xiàn)階段我們可以總結(jié)賦值語句為:變量=值;
/* 將1.0賦給w,將w賦給z... */
float x, y, z, w;
x = y = z = w = 1.0f;
/* 這相當(dāng)于 */
float w = 1.0f;
float z = w;
float y = z;
float x = y;
變形的賦值語句
int a = 2;
a = a + 3; // 相當(dāng)于 a += 3;
a *= 6 - 4; // 相當(dāng)于 a = a * (6 - 4);
可以將變量想像為一個盒子父泳,賦值相當(dāng)于給盒子中放一個物體,盒子中僅能存放一個物體吴汪,但盒子可以重復(fù)使用惠窄。上面的代碼中為變量設(shè)置了不同的值,這相當(dāng)于為盒子放入了不同的物體漾橙,同時也表明變量可以被重復(fù)使用杆融。
在經(jīng)過第二行代碼運(yùn)算后a的值是5,現(xiàn)在考慮一下這個結(jié)果的由來:a的初始值是2霜运,我們使用這個初值與常量數(shù)值3相加脾歇,將結(jié)果5賦值給變量a。有沒有覺察到什么不同淘捡?對于變量a藕各,在賦值運(yùn)算符的左右兩側(cè),我們使用的不同的含義焦除。在右側(cè)參與表達(dá)式運(yùn)算時激况,我們是使用a存儲的數(shù)值,在為左側(cè)賦值時,我們把a(bǔ)當(dāng)作了一個可以存儲物體的盒子乌逐。
在第二行代碼后面的注釋中竭讳,我們給出了原代碼的簡寫形式(可以少輸入一些字符)。在第三行中浙踢,我們直接使用了簡寫形式绢慢,此時右則是一個表達(dá)式: 6-4,整條賦值語句是先計(jì)算此表達(dá)式的值洛波,a值再與結(jié)果相乘胰舆。這是因?yàn)橘x值運(yùn)算符是從右向左結(jié)合的。
我想你也可以猜到奋岁,除了+=思瘟,*=簡寫形式,C語言還提供了-=闻伶、/=滨攻、%=簡寫運(yùn)算符。再次對于/=蓝翰,%=提醒:除數(shù)不能為0光绕。
完整的示例
#include <stdio.h>
int main()
{
float x, y, z, w;
x = y = z = w = 1.0f;
printf( "x=%f\n", x );
int a = 2;
a = a + 3; // 相當(dāng)于 a += 3;
printf( "a=%d\n", a );
a *= 6 - 4; // 相當(dāng)于 a = a * (6 - 4);
printf( "a=%d\n", a );
return 0;
}