目錄
運算式求值
隱式型別轉換
整形提升的意義
整形提升的具體實體
?
算術轉換
運算子屬性表
優先級結合性表
問題運算式

運算式求值
之前淺談了一下運算式求值,主要是針對賦值運算式和判斷運算式,今天來講一下算術運算式的一些特別的性質,算術運算式的求值一般要很久運算子的優先級和結合性,但是有時候也需要一些特殊的性質
隱式型別轉換
c的整形運算總是至少以預設整形型別的精度來進行的,為了達到這種精度,運算式中的字符和短整型往往會在使用之前被轉換成普通整形,這種轉換被稱為整形提升
整形提升的意義
運算式的運算是在cpu的相應計算器中進行的,CPU內運算器運算元的位元組長度一般都是一個整形的大小,對于char和short這種小于四個位元組的運算元,cpu難以實作,往往需要先進行轉換,在送進cpu進行運算
整形提升的具體實體
實體1
#include<stdio.h>
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
return 0;
}
//這個程式的結果是什么呢

最后c不需要進行整形提升,條件為真列印c,所以程式運行的結果為c
實體2
#include<stdio.h>
int main() {
char a =1;
printf("%u\n", a);
printf("%u\n", +a );
printf("%u\n", -a);
}

看到這里希望大家可以理解整形提升
算術轉換
當兩個運算元型別不同時,至少需要其中一種型別轉換成另一種型別,有時可能兩種都要轉換成int型,否則操作無法進行,下面是根據轉換的優先性建立的表
| long double | 1 |
| double | 2 |
| float | 3 |
| unsigned long int | 4 |
| long int | 5 |
| unsigned int | 6 |
| int | 7 |
排名低的會轉化成排名高的運算元型別,然后再進行運算
運算子屬性表
優先級結合性表
| 運算子 | 結合性 |
| () [] -> . | 左結合 |
| ! ~ ++ -- +(正號) -(負號) * & (型別)sizeof | 右結合 |
| * / % | 左結合 |
| + - | 左結合 |
| << >> | 左結合 |
| < <= > >= | 左結合 |
| == != | 左結合 |
| & | 左結合 |
| ^ | 左結合 |
| | | 左結合 |
| && | 左結合 |
| || | 左結合 |
| ? : ; | 右結合 |
| = += -= *= /= %= &= ^= |= <<= >>= | 右結合 |
| , | 左結合 |
從下往上優先級越來越高
問題運算式
運算式都是有準確的值的,但是有一些運算式根據優先級和結合性,并沒有唯一的計算路徑,答案也不唯一,這個時候不同的編譯器會有不同的結果,這種運算式被稱為問題運算式,接下來給兩個經典的問題運算式
經典問題運算式1:
int i=2;
int a=(i++)+(++i)+(++i);
printf("%d",a);
在vs編譯器下結果為12,在gcc環境下為10
經典問題運算式2
int i=1;
printf("%d %d",++i,i++);
首先我們得知道,printf函式傳參是從右往左進行的,一定是先傳右邊再傳左邊
vs編譯器的結果為 3 1
vc6++編譯器的結果為 2 1
當我們遇到這種運算式的時候,不需要去疑惑答案的正確性,因為這本身就是個問題
今天的博客分享就到這了,下一期指標,更精彩哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413643.html
標籤:其他
上一篇:C語言初階:猜數字游戲

