標籤:
C語言為何這麼強大呢?其中之一就是因為他擁有強大的運算能力,除了簡單的加減乘除等算術運算,還有取餘運算(%)、賦值運算(=)、自增自減運算(++、--)、求位元組數(sizeof)、關係運算(==、>、<、>=、<=)、邏輯運算(與、或、非)以及三目運算(條件?數值1:數值2)
下面我列出其中的一些小細節
第一個程式:
#include<stdio.h>
int main(){
int a = -10 % 3;
printf("%d\n",a);
}
對比
#include<stdio.h>
int main(){
int a = 10 % -3;
printf("%d\n",a);
}
第一程式輸出的結果是:-1,第二個的輸出結果是:1
結論:取餘運算(或者叫模運算)的兩邊首先必須是整數(可以是負數),餘數的正負依賴%前邊數值的正負
第二個程式
#include<stdio.h>
int main(){
int a = 10.5;
printf("%d\n",a);
}
第三個程式
#include<stdio.h>
int main(){
double b = 11/4;
printf("%d\n",b);
}
第二個程式的輸出結果是:10,第三個程式的輸出結果是:3
結論:因為a為int型,而10.5是double型所以將double自動轉換成int型,我們也可以這樣改:
int a = (int) 10.5;
這種方法是強制類型轉換;第三個程式中由於10和4都為整型數值所以輸出結果肯定是整型,即使b的類型是double型,結果還是3,要想結果變成3.75,可以這樣修改:
double b = 9.0/4;或者double b = 9/4.0;或者double b = (double)9/4;
第四個程式
#include<stdio.h>
int main(){
int a = 4;
a *= 2 + 3;
printf("%d\n",a);
}
這個程式的輸出結果是:20
結論:複合賦值運算子後面是一個整體,相當於一個小括弧將他們括起來了,之後再作相應的複合賦值
第五個程式
#include<stdio.h>
int main(){
int a = 4;
printf("%d,%d\n",a,a++);
}
第六個程式
#include<stdio.h>
int main(){
int a = 4;
printf("%d,%d\n",++a,a);
}
這兩個程式的結果都是:5,4
結論:為啥會是這個結果呢?首先我們要理解a++與++a的區別,前者是先將數值a的原值執行運算,後將數值增一,後者正好相反,先將原值增一,然後執行計算,至於為啥兩者結果都是一樣,這是由於printf函數在編譯器中的計算順序是從右往左,(因編譯器不同,也可能是從左往右)所以導致了這樣的結果
第七個程式
#include<stdio.h>
int main(){
int a = 4;
printf("%d,%d,%d\n",sizeof a,sizeof 4,sizeof (int));
}
輸出結果為:4,4,4
結論:只需要注意sizeof後面要是跟上的是基本類型標識符的話 必須加上小括弧其他的可加可不加
至於關係運算子我們需要注意的每一個關係運算式都有個一傳回值(非0即1,0的話即為假,1的話即為真),邏輯與和邏輯或的集合方向都是自左向右,邏輯運算子的兩邊一般是能判斷出真假的條件,但是也可以跟上任何一個常數,非0常數表示真,0即為假
第八個程式
#include<stdio.h>
int main(){
int a = 4;
int b = 6;
int c= a<3 && b++;
printf("%d,%d,%d\n",a,b,c);
}
輸出結果為4,6,0
結論:當判斷完邏輯與左邊的為假時,C語言是不會判斷右邊的真假,直接得出結果,同理,要是判斷完邏輯或左邊的為真時,他也是不會進行右邊真假的判斷的
C語言中,運算也是有一定的先後順序,就像我們小學裡學到的要先乘除後加減有括弧的先算括弧,C語言中各種運算也是要講究運算的優先順序別的,我們就拿三目運算來說,請看代碼:
int main()
{
int c = 10;
int d = 24;
//將c和d中較大者與2相加賦值給變數a
int a = 2 + (c > d)? c : d;
printf("%d\n",a);
return 0;
}
當我們編譯串連的時候Xcode會警告我們的,因為+的優先順序別高於三目運算子,所以你這樣先完後 ?的前面永遠是真,程式始終會將c的值加2賦值給a,所以只有將程式的第三行代碼改為:int a = 2 + ((c > d)? c : d); 這樣才會保證你想要的結果。
結論:當我們用到C語言進行一些運算時,一定要注意優先順序,一旦一個式子中有過多的運算子,一般他的可讀性是很差的,這時我們就要將複雜的算式拆成多行代碼,保證程式的可讀性,另一方面也能保證程式會按照我們的思路進行下去。
關於C語言基本運算的一些注意點