賦值運算子及賦值表示式,C語言賦值運算子及其賦值表示式詳解

2020-07-16 10:04:20
賦值操作是程式設計中最常用的操作之一,C 語言共提供了 11 個賦值運算子,均為二元運算子,其中僅有一個為基本賦值運算子 =,其餘 10 個均是復合賦值運算子,即:
  • 基本賦值運算子:=。
  • 複合賦值運算子:+=(加賦值)、-=(減賦值)、*=(乘賦值)、/=(除賦值)、%=(求餘賦值)、 <<=(左移賦值)、>>=(右移賦值)、&=(按位元與賦值)、|=(按位元或賦值)、*A=(按位元互斥或賦值)。

賦值操作的優先順序較低,僅高於逗號運算子。

基本賦值 =

如 int a=5; 表示把 5 賦值給整型變數 a,不能讀成 “a等於5”。賦值號左邊必須為左值,賦值號右邊的右值可以為常數、變數或表示式。如下賦值均是正確的。
int a,b; //定義整型變數a和b
a=3; //把常數3賦值給a,右值為常數
b=a; //把變數a的值賦給b,右值為變數
b=a+3; //把求和表示式a+3的值賦給b,右值為表示式
以下賦值均是錯誤的。
int a=2;
3=a; //錯誤,常數3不能作為左值
const int b=5; //定義整型常變數唯讀變數b,並初始化為5,其值不能被改變
b=1; //錯誤,企圖改變常變數的值,即常變數不能作左值

複合賦值:+=、-=、*=、/=、%=

a+=b; 等價於 a=a+b;
a-=b; 等價於 a=a-b;
a*=b; 等價於 a=a*b;
a/=b; 等價於 a=a/b;

例如:
int a=5;
a+=3; //等價於 a=a+3;
由於賦值運算子的優先順序很低,僅高於逗號運算子,故最後做賦值操作。

a+=3+2; 等價於 a=a+(3+2);

通過下面的例子,掌握上述 4 種複合賦值運算子。

【例 1】分析以下程式,輸出其執行結果。
#include<stdio.h>
int main (void)
{
    int a=l,b=2,c=3; //定義三個整型變數,並初始化
    float d=10.2f; //定義float變數d,用浮點常數10.2初始化
    a+=1; //相當於 a=a+1;即 a=1+1=2
    b-=a+5;
    c*=a-4;
    printf ("%d,%d,%d,%f",a,b,c,d/=a);
    return 0;
}
程式碼分析:
1) float d=10.2f; 如果改為 float d=10.2; 雖然沒有語法錯誤,可以正常執行,但一般編譯器會提示 warning(警告),原因是編譯器會把 10.2 等常數預設當成 double 型常數處理,與 d 的型別 float 不一致,故出現警告。因此可通過加 f 明確 10.2 為 float 型常數。

2) a+=1; 相當於 a=a+1; 求出 a 為 2。

3) b-=a+5; 由於賦值運算子的優先順序低於算術求和運算子,故該語句等價於 b=b-(a+5);,即 b=2-(2+5);,得 b=-5;。同理,c*=a-4; 即 c=3*(2-4);,故 c=-60

4) printf("%d,%d,%d,%f",a,b,c,d/=a); 由於輸出列表中 a、b 和 c 均為 int 型變數,故輸出格式預留位置均為 %d;輸出列表中第 4 項為表示式,其表示式的值為 d=d/a=10.2f/2=5.1,為浮點型別,輸出格式預留位置為 %f,在 VC++ 6.0 環境中,float 型別為小數點後保留 6 位數位。

執行結果為:
2,-5,-6,5.100000