常量
常量的表現形式
常量是程序中不可改變的量
常量經常以字面量,或者宏定義的方式出現。
常量主要用於賦值或參與計算,並且常量也是有類型的。
字面量形式
我們先簡單來理解常量和變量
#include <stdio.h>
int main()
{
int age = 30;
age = age + 10;
return 0;
}
上面代碼中,age是變量,30和10是字面常量。
宏定義形式
#include<stdio.h>
#define PI 3.1415926
int main()
{
int radius = 2;
printf("area = %f", radius * radius * PI);
return 0;
}
運行結果爲:
上面代碼中,PI是宏定義常量,後面3.1415926是替換文本
宏定義在預處理階段替換。
我們在linux平臺進行演示:
接下來我們進行預處理操作:
gcc -E main.c -o main.i
打開mian.i文件:
使用宏定義常量,在代碼中所有出現宏名的地方都會被替換文本替換,修改代碼中的宏名對應的替換文本時,只需要在宏定義的位置修改宏明對應的替換文本即可。
常量的類型
我們進行類型說明:
#include <stdio.h>
int main()
{
int number = 60;
float salary = 1234.56;
char sex = 'm';
char name[] = "xiaoming";
return 0;
}
上面的 60 是整型常量
上面的 1234.56 是實型常量
上面的 m 是字符常量
上面的 xiaoming 是字符串常量
那麼常量到底是整型中的哪一種類型?
實型又是具體的哪一種類型?
我們下面進行說明。
0是一個整型常量,但是能不能具體到某種類型的呢?
0.0是一個浮點型常量,但是能不能具體到某種類型的呢?
我們可以通過計算大小來進行解決:
#include <stdio.h>
int main()
{
printf("sizeof (0) = %d",sizeof(0));
printf("sizeof (0.0) = %d",sizeof(0.0));
return 0;
}
運行結果如下:
上面兩個都是常量0
我們通過代碼驗證:
上面的0是int類型
上面的0.0是double類型
默認的整型常量是 int 類型,默認的實型是 double 類型。
我們也可以通過下面操作修改常量類型並且打印所佔字節數:
出現在數據後面的字母是直接對於數據類型或者說所佔字節數大小進行限制。
#include <stdio.h>
int main()
{
printf("const sizeof(0.0) = %d\n",sizeof(0.0)); //double
printf("const sizeof(0.0f) = %d\n",sizeof(0.0f));//0.0F float
printf("const sizeof(0.0L) = %d\n",sizeof(0.0L));//0.0l long double
printf("const sizeof(0) = %d\n",sizeof(0)); //int
printf("const sizeof(0l) = %d\n",sizeof(0l));//long
printf("const sizeof(0ll) = %d\n",sizeof(0ll));//long long
return 0;
}
在vs2019平臺運行結果如下:
在Qt運行結果如下:
在這裏我們要強調:
不同的平臺打印出來不同的結果
接下來我們介紹一種情況:
#include <stdio.h>
int main()
{
char ch = -1;
short sh = -1;
int in = -1;
printf("%x\n", ch);
printf("%x\n", sh);
printf("%x\n", in);
return 0;
}
運行結果爲:
那麼爲什麼會出現這樣的結果呢?
第一個變量ch是char類型佔1個字節,所以佔8位二進制數 ,用十六進制表示是 : FF
一個F表示4位二進制數字。
第二個變量sh是short類型佔2個字節 , 所以佔16位二進制數字 用十六進制表示是 :FF FF 。
第三個變量in是int類型佔4個字節,所以佔32位二進制數 用十六進制表示是 : FF FF FF FF。
那麼運行結果應該是:
ff
ffff
ffffffff
實際的結果本應該是上面結果,只不過這裏進行了整型提升
意思就是char類型在運算的時候會轉換爲int
short類型在運算的時候會轉換爲int
int類型在運算的時候仍然是int類型
所以我們正常打印應該是這樣打印:
#include <stdio.h>
int main()
{
char ch = -1;
short sh = -1;
int in = -1;
printf("%hhx\n", ch); //這裏我們給出%hhx 表示只打印一個字節
printf("%hx\n", sh); //這裏我們給出%hx 表示只打印兩個字節
printf("%x\n", in); //這裏我們給出%x 表示只打印四個字節
return 0;
}
在linux平臺結果爲:
在Qt編譯器運行結果爲:
在vs2019編譯器下面運行結果爲:
上面打印結果不同平臺會有差異
那麼char 類型-1 在內存中表示也就是1111 1111 就是FF
short 類型 -1 在內存中表示也就是1111 1111 1111 1111就是FFFF
int 類型-1 在內存中也就是 1111 1111 1111 1111 1111 1111 1111 1111 就是 FFFFFFFF
注意需要深刻理解的一點:
我們先給出代碼演示,然後進行說明。
#include <stdio.h>
int main()
{
char ch = -1;
printf("%d\n", ch);
printf("%u\n", ch);
printf("%u\n", (unsigned char)ch);
return 0;
}
運行結果爲:
上面三種不同的打印結果是對於8位二進制數1111 1111 的不同解釋所打印的結果。
所以物理內存如何存儲並不重要,重要的在於我們如何去解釋這段物理存儲。
1111 1111只是物理存儲的存在。
例如上面打印結果:
1111 1111 char 類型就代表 -1 unsigned char 類型就代表 255
常量類型
整型常量
整型常量通常有三種表現形式
十進制常量
198 0 -23 216L 213u 213LU
L或者l 表示長整型
除了表示0以外不以0開頭,避免和八進制混淆
U或者u表示無符號數
八進制常量
以0開頭的連續數字序列 序列中只能有 0~7這8個數字
例如: 045 -076 034212l 028711u
十六進制常量
以0x 或者0X開頭 序列中只有 0~9 ,A~F ,a ~ f 這些數字和字母
字母a,b,c,d,e,f分別對應10,11,12,13,14,15 大小寫都可以。
實型常量
小數形式
float salary = 1234.56;
double number = 6.54321;
上面直接出現的字面浮點數表示實型常量。
我們在這裏說明一點:
printf(“.0”);
printf(“0.”);
printf(“0.0”);
上面三者等價
printf(“.5”); 和 printf(“0.5”); 意義相同
printf(“5.”); 和 printf(“5.0”); 意義相同
指數形式
指數形式及就是科學計數形式:以10爲底的冪數
要求:
①:字母e或者E之前必須要有數字
②:字母e或者E後面的指數必須爲整數
字母e或E的前後及數字之間不允許有空格
默認是double類型佔8個字節
後綴爲f 或F 表示float類型
後綴l或者L表示爲long double類型。
例如:34.2f .5E3 4.5e0 34.2f 2.5E3L
字符常量
字符常量的表現形式比較簡單。以單引號引起來的一個字符。
例如:‘a’ ‘b’ ‘c’
字符串常量
字符串常量的表現形式比較簡單。以雙引號引起來的一串字符。
例如:”a” “abcdefg”
小結
最後我們強調一點:
默認的整型常量是 int 類型,默認的實型是 double 類型
常量和變量在內存所保存的位置是不一樣的,在後續博客我們進行詳細說明