1. #define N 10 int x[N] ;與int N=10 ;int x[10];為什麼前面對,後面這個是錯的
#define N 10,是預編譯過程,在編譯前會把所有的N替換成10,因此int x[N]在編譯前會被換成:int x[10];,N即常量10,因此不會有錯。
至於 後面int N = 10; int x[N]; N為變數,在c語言中,是不允許的。
2. C語音中的符號常量的定義方法是什麼
符號常量定義用#define。
符號常量在使用之前必須先定義,其一般形式為:
形式為:#define 標識符 常量
eg: #define PI 3.14 //沒有分號
#define 是一條預編譯命令(預處理命令都以"#"開頭),稱為宏定義命令,在預編譯時僅僅是進行字元替換。符號常量不佔內存,只是一個臨時符號,在預編譯後這個符號就不存在了,故不能對符號常量賦以新值。習慣上符號常量的標識符用大寫字母,變數標識符用小寫字母,以示區別。
3. 在java中如何實現預編譯
/*
* ProCompile.java *預處理要編譯的文件,刪除多餘的空白,注釋,換行,回車等
* Created on 2007年9月18日, 下午8:58 */ package javacompile; import java.io.*;
import java.util.regex.*;
import javax.swing.JOptionPane; /** * @com.junjian.sun public class PerCompile { File f = null;
String fileString = null;
Pattern p = null;
Matcher m = null;
String regex; //正則表達式 //初始化p
public PerCompile() {
regex ="(//.+)" + //(//.+) 對應單行注釋
//"|(/\\*(.+\\n)+\\*/)"+ // 想對應多行注釋... "|(\\r\\n)" + "|(\\n)"+//(\\r\\n)|(\\n)對應換行
"|(\\B\\s+)" ; // 空白符
String ss;
f = new File(new JOptionPane()
.showInputDialog("請輸入文件所在路徑~"));
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
ss = bf.readLine()+"\n";
fileString = ss; //如果沒有這兩句,ss的開頭會有「null」
while((ss = bf.readLine())!= null){
fileString += ss+"\n"; bf.close();
} catch (IOException ex) {
ex.printStackTrace(); p = Pattern.compile(regex);
m = p.matcher(fileString); //執行替換所有多餘空行,空白符,注釋
void Dels(){
System.out.println("before: "+fileString);
if(m.find()) System.out.println("find!!");
System.out.println(m.replaceAll("")); } }
-
4. 設有宏定義:&define MUL(x,y)x*y則宏調用MUL(2+3,5)的結果為17
是的。
造成這種結果的原因,是由於宏定義本身的特性造成的:
define僅僅是字元替換,因此在將NUL(2+3,5)時,x是2+3,y是5,直接將表達式x*y替換字元後,則變成了2+3*5,其計算結果在乘法優先於加法的作用下會得到17這個數值。
為了避免這種情況,有兩種辦法解決
定義更安全的宏定義,即使用括弧將表達式括起來,避免了優先順序在替換後變化。
define MUL(x,y) (x)*(y)
將宏定義改變為函數
int MUL(int x,int y){
return(x*y);
}
5. C語言#define X 23.6f,X為什麼是一串字元呀
define 宏定義
預編譯時 做字元串替換 操作
可以的話,盡量 用括弧,避免出錯
#define X 23.6f
6. C語言 宏
難道3不能是字元串嗎?
"3*pi"是字元串,"3"是它的子串。
"3*pi"宏展開後為"3*3.1415926"也是字元串,整個源程序都被認為字元串!
現在,還有有編譯,編譯時,編譯器會把3*3.1415926當表達式計算,用結果再替換一次!
7. 宏定義的格式
1.不帶參數的宏定義: 宏定義又稱為宏代換、宏替換,簡稱「宏」。 格式: #define 標識符 字元串 其中的標識符就是所謂的符號常量,也稱為「宏名」。 預處理(預編譯)工作也叫做宏展開:將宏名替換為字元串。 掌握"宏"概念的關鍵是「換」。一切以換為前提、做任何事情之前先要換,准確理解之前就要「換」。 即在對相關命令或語句的含義和功能作具體分析之前就要換: 例: #define PI 3.1415926 把程序中出現的PI全部換成3.1415926 說明: (1)宏名一般用大寫 (2)使用宏可提高程序的通用性和易讀性,減少不一致性,減少輸入錯誤和便於修改。例如:數組大小常用宏定義 (3)預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。 (4)宏定義末尾不加分號; (5)宏定義寫在函數的花括弧外邊,作用域為其後的程序,通常在文件的最開頭。 (6)可以用#undef命令終止宏定義的作用域 (7)宏定義可以嵌套 (8)字元串" "中永遠不包含宏 (9)宏定義不分配內存,變數定義分配內存。 2.帶參數的宏: 除了一般的字元串替換,還要做參數代換 格式: #define 宏名(參數表) 字元串 例如:#define S(a,b) a*b area=S(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2; 類似於函數調用,有一個啞實結合的過程: (1)實參如果是表達式容易出問題 #define S(r) r*r area=S(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b; 正確的宏定義是#define S(r) (r)*(r) (2)宏名和參數的括弧間不能有空格 (3)宏替換只作替換,不做計算,不做表達式求解 (4)函數調用在編譯後程序運行時進行,並且分配內存。宏替換在編譯前進行,不分配內存 (5)宏的啞實結合不存在類型,也沒有類型轉換。 (6)函數只有一個返回值,利用宏則可以設法得到多個值 (7)宏展開使源程序變長,函數調用不會 (8)宏展開不佔運行時間,只佔編譯時間,函數調用占運行時間(分配內存、保留現場、值傳遞、返回值)
8. c語言編譯預處理
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
如果用一張圖來表示:
讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理
[析] 偽指令主要包括以下四個方面
(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的'出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3)頭文件包含指令,如#include "FileName"或者#include 等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
注意:
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
9. 宏替換只是字元替換,不佔用編譯時間是不是正確
宏是在預編譯期間進行的,將代碼中的指定字元轉換
轉換結束後,再進行編譯
所以不佔用編譯時間
10. 4.宏替換就是字元替換,不能進行任何計算。 (2分)
這句話是對的。宏替換只作替換,不做計算,不做表達式求解。
不帶參數的宏代換,格式為: #define 標識符 字元串
帶參數的宏代換:除了一般的字元串替換,還要做參數代換。
格式為:#define 宏名(參數表) 字元串
(10)字元替換預編譯擴展閱讀
宏的優缺點
優點:
1、增強代碼的復用性。
2、提高性能。
缺點:
1、不方便調試宏。(因為預編譯階段進行了替換)
2、導致代碼可讀性差,可維護性差,容易誤用。
3、沒有類型安全的檢查。