const定義的變量
先看一段代碼:
#include<stdio.h>
#include<stdlib.h>
int main()
{
const int n = ;
n = ; //可以指派嗎?
printf("%d\n", n);
system("pause");
return ;
}
可見const修飾的變量不能被改。
在c語言中,當const修飾一個辨別符的時候,我們說,const依然是一個變量,隻是它具有常屬性,不能被改。
test.c
const int n = ;
int arr[];
int arr2[n];//可以嗎?
它不能用于表示數組的大小,可見const修飾的n是一個變量。
在c++中,const修飾的辨別符就是常量
const int n = ;
int arr[];
int arr2[n];//可以嗎?
我們會發現編譯時沒有任何錯誤,
我們在來看一段代碼:
#include<stdio.h>
#include<stdlib.h>
int main()
{
const int n = ;
int *p = (int *)&n;
*p = ;
printf("%d\n", n);
system("pause");
return ;
}
看看程式會輸出什麼?
我們看看記憶體中num的變化:
記憶體中的num已經變成了20,但為什麼輸出還是10呢?????
編譯器在編譯期間可能對代碼進行優化。
當編譯器看到這裡的num被const修飾,從語義上講這裡的num是不期望被改變的,那優化的時候就可以把num的值存放到寄存器(用于提高通路效率)中。以後隻要使用num的地方都去寄存器中取,那即使num對應的記憶體中的值發生變化,寄存器也是感覺不到的,是以造成輸出10的結果。
volatile
當我們對代碼進行以下修改:
#include<stdio.h>
#include<stdlib.h>
int main()
{
volatile const int n = ;
int *p = (int *)&n;
*p = ;
printf("%d\n", n);
system("pause");
return ;
}
程式又會輸出什麼?
是以volatile起到了關鍵的作用。
volatile的作用:編譯時不優化,執行時不緩存,每次需要從記憶體中讀出(保證記憶體的可見性)。
使用場景:用于多線程或多CPU線程。