編譯器常量
A. visual studio 如何在編譯期確定字串長度,特殊宏之類的
宏的作用,只是在編譯期間完成替代,並不能實現計算。因此不要考慮宏實現,這個沒什麼可行性。
編譯期間數值確定,其實可以通過const關鍵字實現,但說實話,這個是「消耗空間換時間」,如果有log的函數太多,太分散,並不值得。
如果log比較集中的在幾個函數中,那麼可以這么做:
constintfnamelen=strlen(__FUNCTION_);這樣,因為編譯之後__FUNCTION_是一個常量,const 變數會直接從編譯器的符號表中取值(這個叫C++的常量折疊),不會反復計算。
log(__FUNCTION_,fanmelen);
B. 在C程序中,怎麼使用常量
1.數值常量:例如 a = b + 5;,這里的5就是常量。在常量後加上恰當的後綴可以表示特定類型的常量,例如1.0f是float常量。不帶後綴的浮點數默認類型為double。
2.符號常量:用#define替換為數值常量,只存在於編譯期。例如
#define A 5
定義了一個符號常量A,編譯時預處理器會把這之後的A替換為5。
3.const數據類型:
例如定義一個int常量:const int a = 5;,這里 a 為 const int 類型。類型有const修飾時,編譯器會對修改此數據的行為視為編譯錯誤。因此把const數據作為常量使用。
另外還有字元/字元串字面量:類似'a'或"aaa"的字元/字元串為字面量。字面量在C語言中不是常量(在C++中是常量),因為C語言標准中定義了修改其中內容的操作為「未定義行為」,修改操作可能引起不確定的後果。如果約定不用指針等方式修改其中內容,可以把字面量當做常量使用。用前置的const修飾指針,可以限制指針修改其中內容,例如const char* str = "aa";,指針str指向的內容無法通過str修改,可以把str指向的內容視作常量字元串。用#define替換得到的字面量是匿名的,也可以當做常量使用。
====
[原創回答團]
C. 什麼是常量表達式 書里說,常量表達式是編譯器在編譯時就能夠計算出結果的表達式. 不太理解,
舉例:
int n = 1; //這是確定無疑的,1是常量表達式,不可能變化
另一個例子:
int x = n + 1; //編譯器並不能根據這句就推斷出x一定等於2,因為極有可能在其他地方改變n的值,因此編譯器就不敢保證它是常量
D. C語言程序中的關於常量的計算是在編譯時進行的還是程序執行時進行的
編譯的時候,先會進行預編譯處理,就是把程序中所有的符號常量用數字常量替換,比如說你的例子中的N,注意只是發生替換,所有的計算都是在程序執行的時候進行的! C是面向過程的,每次執行都會重新計算一次!
E. 英飛凌單片機編譯時常量數據在哪
p0不是普通變數,是內部寄存器,能讀能寫,同時它硬體上有輸入輸出埠和它對應
F. C語言中系統既然不給常量分配存儲空間,那麼編譯系統又是如何"記憶"和使用常量的呢
耐心看完,你應該能明白了:
C語言中,常量和變數是放在不同的"段"(section)里,程序一旦載入,常量/變數自然都在內存里了。
常量和全程變數,放在初始化段。
局部變數,通常在棧里。
常量在程序載入時同時載入。
G. 編譯時出現 字元型常量太長在main函數中
#include "stdio.h"
#include "math.h"
int main()
{
char diamond[][7]=
{
{' ',' ',' ','*'},
{' ',' ','*','*','*'},
{' ','*','*','*','*','*'},
{'*','*','*','*','*','*','*'},
{' ','*','*','*','*','*'},
{' ',' ','*','*','*'},
{' ',' ',' ','*'},
};
int i,j;
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
printf("%c",diamond[i][j]);
printf("\n");
}
return 0;
}
H. 什麼是編譯時常數 運行時常數
t.TextField;
I. java中編譯期常量所指的是什麼
classInitalizedClass{
static{
System.out.println("!");
}
publicstaticintinititalize_varible=1;
}
{
publicstaticvoidmain(String[]args){
System.out.println(InitalizedClass.inititalize_varible);
}
}
上面的結果是:
!
1
classInitalizedClass{
static{
System.out.println("!");
}
//和上面的例子唯一的差異就是此處的變數INITIALIZED_VARIBLE被聲明為final
_VARIBLE=1;
}
{
publicstaticvoidmain(String[]args){
System.out.println(InitalizedClass.INITIALIZED_VARIBLE);
}
}
上面的結果是:
1
為什麼兩個例子執行結果不一樣,原因是第二個例子中的INITIALIZED_VARIBLE為編譯期常量,它不會導致類的初始化的
J. 如何在編譯java的時候,取消編譯器對編譯常量的優化
遇到的問題是想重新編譯某個java文件(比如A.java),裡面有個常量(比如finalinta)和上次編譯時不一樣,但是另一個使用A.class的a的文件(比如B.java)由於在javac在上次編譯的時候將當時的A.class裡面的常量直接給內聯了,所以就達不到想要的效果。
如果是這樣的話,對於String可以使用.intern()來防止編譯器進行優化,對於其他類型,可以要麼不定義為常量,要麼將常量定義為private,然後使用一個static方法來返回這個常量。