當前位置:首頁 » 編程語言 » c語言規約

c語言規約

發布時間: 2022-09-19 04:36:29

1. c語言里要對輸出的結果用科學計數法表示保留三位有效數字應該怎麼寫啊

sorry.由於沒有在計算機旁,沒有及時看到你的求助,你問:C語言里要對輸出的結果用科學計數法表示保留三位有效數字應該怎麼寫?
我覺得應該是
printf("%.3e",變數名);
而不是
printf("%3e",變數名);
==================
MSDN 中有關printf列印格式串:
%[flags] [width] [.precision] [{h | l | I64 | L}]type
的描述,其中對[.precision]是這么說的:
The third optional field of the format specification is the precision specification.
(大義:格式規約中第三個選項段是關於小數的規則。)
==================
對於列印e, E類型的數據時,[.precision]選項的作用是:
The precision specifies the number of digits to be printed after the decimal point. The last printed digit is rounded.
(大義:該精度指定了列印小數點後的位數,之後的位數會被四捨五入)
Default precision is 6; if precision is 0 or the period (.) appears without a number following it, no decimal point is printed.
(大義:預設情況下,該精度為6,如果精度值為0或者小數點後沒有緊跟著數字,則不會列印小數部分)
==================
例:
#include <stdio.h>
int main()
{
float b = 100000.55555f;
printf("%3e\n",b);
printf("%.3e\n",b);
return 0;
}
輸出結果為:
1.000006e+005
1.000e+005

2. c++中,UINT __cdecl是數據類型

UINT是數據類型unsigned int別名,而__cdecl不是數據類型,只是聲明函數的調用類型是c語言的調用方式。具體調用方式可以看前一個的回答。

3. z語言和C語言誰比較好

C語言比較好點。
C語言的運算符包含的范圍很廣泛,共有34種運算符。C語言把括弧、賦值、強制類型轉換等都作為運算符處理。從而使C語言的運算類型極其豐富,表達式類型多樣化。靈活使用各種運算符可以實現在其它高級語言中難以實現的運算。
Z語言是一種以一階謂詞演算為主要理論基礎的規約語言,是一種功能性語言。Z語言是將事物的狀態和行為用數學符號形式化表達的語言,為編寫計算機程序和驗證計算機程序的正確性提供依據,是軟體工程中編碼之前的規格說明語言。

4. 計算機科學與技術中編譯原理簡答題

時間有點久記得不太真切,用通俗語言說,希望題主盡量查閱書籍參考資料自行驗證理解。

1、什麼是移進項目,什麼是規約項目

這個是自頂向下和自下向上分析時候用到的。所謂移進就是不處理,所謂規約就是處理,合並,替換。比如當前符合某個正規式左部,就用這個正規式右部替換左部,稱為規約。兩種操作的目的都是為了分析整體是否符合語法樹。

2、請給出生成C語言語句序列的文法(假定s表示任意一個語句,它為終結符)

關於這個,我感覺你描述的不是很清楚,因為C語言文法包含的正規式還是挺多的,如果單指statement的話,
statement_listà
statement
| statement_list statement

Statementà
| compound_statement
| expression_statement
| selection_statement
| iteration_statement
| jump_statement
再配合上相應的終結符。

3、能用上下文無關文法生成正規集嗎?為什麼?

可以。不過無法保證不含沖突。

4、計算first集和follow集對於構造自頂向下的語法分析器有什麼作用?

可以用來排除沖突。例如移進-移進沖突,移進-規約沖突。

5、是否可能存在這樣一個DFA,它的所有狀態都是接受狀態,包括其實狀態,為什麼?

這個愛莫能助,據我的構想是可以的,但是這樣的DFA最終都會成為單一狀態DFA。

5. C語言中如何做表達式的規約

給個提示吧 有棧來處理...

看下這個http://ke..com/view/38877.htm

6. C和C++如何混合編程

在用C++的項目源碼中,經常會不可避免的會看到下面的代碼:

1
#ifdef __cplusplus

2
extern "C" {

3
#endif

4

5
/*...*/

6

7
#ifdef __cplusplus

8
}

9
#endif

它到底有什麼用呢,你知道嗎?而且這樣的問題經常會出現在面試or筆試中。下面我就從以下幾個方面來介紹它:

1、#ifdef _cplusplus/#endif _cplusplus及發散
2、extern "C"
2.1、extern關鍵字
2.2、"C"
2.3、小結extern "C"
3、C和C++互相調用 4、C和C++混合調用特別之處函數指針
3.1、C++的編譯和連接
3.2、C的編譯和連接
3.3、C++中調用C的代碼
3.4、C中調用C++的代碼

1、#ifdef _cplusplus/#endif _cplusplus及發散

在介紹extern "C"之前,我們來看下#ifdef
_cplusplus/#endif
_cplusplus的作用。很明顯#ifdef/#endif、#ifndef/#endif用於條件編譯,#ifdef
_cplusplus/#endif
_cplusplus——表示如果定義了宏_cplusplus,就執行#ifdef/#endif之間的語句,否則就不執行。

在這里為什麼需要#ifdef _cplusplus/#endif
_cplusplus呢?因為C語言中不支持extern "C"聲明,如果你明白extern
"C"的作用就知道在C中也沒有必要這樣做,這就是條件編譯的作用!在.c文件中包含了extern "C"時會出現編譯時錯誤。

既然說到了條件編譯,我就介紹它的一個重要應用——避免重復包含頭文件。還記得騰訊筆試就考過這個題目,給出類似下面的代碼(下面是我最近在研究的一個開源web伺服器——Mongoose的頭文件mongoose.h中的一段代碼):

01
#ifndef MONGOOSE_HEADER_INCLUDED

02
#define MONGOOSE_HEADER_INCLUDED

03

04
#ifdef __cplusplus

05
extern "C" {

06
#endif /* __cplusplus */

07

08
/*.................................

09
* do something here

10
*.................................

11
*/

12

13
#ifdef __cplusplus

14
}

15
#endif /* __cplusplus */

16

17
#endif /* MONGOOSE_HEADER_INCLUDED */

然後叫你說明上面宏#ifndef/#endif的作用?為了解釋一個問題,我們先來看兩個事實:

這個頭文件mongoose.h可能在項目中被多個源文件包含(#include

"mongoose.h"),而對於一個大型項目來說,這些冗餘可能導致錯誤,因為一個頭文件包含類定義或inline函數,在一個源文件中mongoose.h可能會被#include兩次(如,a.h頭文件包含了mongoose.h,而在b.c文件中#include
a.h和mongoose.h)——這就會出錯(在同一個源文件中一個結構體、類等被定義了兩次)。
從邏輯觀點和減少編譯時間上,都要求去除這些冗餘。然而讓程序員去分析和去掉這些冗餘,不僅枯燥且不太實際,最重要的是有時候又需要這種冗餘來保證各個模塊的獨立。

為了解決這個問題,上面代碼中的

#ifndef MONGOOSE_HEADER_INCLUDED
#define MONGOOSE_HEADER_INCLUDED
/*……………………………*/
#endif /* MONGOOSE_HEADER_INCLUDED */

就起作用了。如果定義了MONGOOSE_HEADER_INCLUDED,#ifndef/#endif之間的內容就被忽略掉。因此,編譯時第一次看到mongoose.h頭文件,它的內容會被讀取且給定MONGOOSE_HEADER_INCLUDED一個值。之後再次看到mongoose.h頭文件時,MONGOOSE_HEADER_INCLUDED就已經定義了,mongoose.h的內容就不會再次被讀取了。

2、extern "C"

首先從字面上分析extern "C",它由兩部分組成——extern關鍵字、"C"。下面我就從這兩個方面來解讀extern "C"的含義。

2.1、extern關鍵字

在一個項目中必須保證函數、變數、枚舉等在所有的源文件中保持一致,除非你指定定義為局部的。首先來一個例子:

1
//file1.c:

2
int x=1;

3
int f(){do something here}

4
//file2.c:

5
extern int x;

6
int f();

7
void g(){x=f();}

在file2.c中g()使用的x和f()是定義在file1.c中的。extern關鍵字表明file2.c中x,僅僅是一個變數的聲明,其並不是在定義變數x,並未為x分配內存空間。變數x在所有模塊中作為一種全局變數只能被定義一次,否則會出現連接錯誤。但是可以聲明多次,且聲明必須保證類型一致,如:

1
//file1.c:

2
int x=1;

3
int b=1;

4
extern c;

5
//file2.c:

6
int x;// x equals to default of int type 0

7
int f();

8
extern double b;

9
extern int c;

在這段代碼中存在著這樣的三個錯誤:

x被定義了兩次
b兩次被聲明為不同的類型
c被聲明了兩次,但卻沒有定義

回到extern關鍵字,extern是C/C++語言中表明函數和全局變數作用范圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變數可以在本模塊或其它模塊中使用。通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變數以關鍵字extern聲明。例如,如果模塊B欲引用該模塊A中定義的全局變數和函數時只需包含模塊A的頭文件即可。這樣,模塊B中調用模塊A中的函數時,在編譯階段,模塊B雖然找不到該函數,但是並不會報錯;它會在連接階段中從模塊A編譯生成的目標代碼中找到此函數。

與extern對應的關鍵字是 static,被它修飾的全局變數和函數只能在本模塊中使用。因此,一個函數或變數只可能被本模塊使用時,其不可能被extern 「C」修飾。

2.2、"C"

典型的,一個C++程序包含其它語言編寫的部分代碼。類似的,C++編寫的代碼片段可能被使用在其它語言編寫的代碼中。不同語言編寫的代碼互相調用是困難的,甚至是同一種編寫的代碼但不同的編譯器編譯的代碼。例如,不同語言和同種語言的不同實現可能會在注冊變數保持參數和參數在棧上的布局,這個方面不一樣。

為了使它們遵守統一規則,可以使用extern指定一個編譯和連接規約。例如,聲明C和C++標准庫函數strcyp(),並指定它應該根據C的編譯和連接規約來鏈接:

1
extern "C" char* strcpy(char*,const char*);

注意它與下面的聲明的不同之處:

1
extern char* strcpy(char*,const char*);

下面的這個聲明僅表示在連接的時候調用strcpy()。

extern "C"指令非常有用,因為C和C++的近親關系。注意:extern "C"指令中的C,表示的一種編譯和連接規約,而不是一種語言。C表示符合C語言的編譯和連接規約的任何語言,如Fortran、assembler等。

還有要說明的是,extern "C"指令僅指定編譯和連接規約,但不影響語義。例如在函數聲明中,指定了extern "C",仍然要遵守C++的類型檢測、參數轉換規則。

再看下面的一個例子,為了聲明一個變數而不是定義一個變數,你必須在聲明時指定extern關鍵字,但是當你又加上了"C",它不會改變語義,但是會改變它的編譯和連接方式。

如果你有很多語言要加上extern "C",你可以將它們放到extern "C"{ }中。

2.3、小結extern "C"

通過上面兩節的分析,我們知道extern "C"的真實目的是實現類C和C++的混合編程。在C++源文件中的語句前面加上extern "C",表明它按照類C的編譯和連接規約來編譯和連接,而不是C++的編譯的連接規約。這樣在類C的代碼中就可以調用C++的函數or變數等。(註:我在這里所說的類C,代表的是跟C語言的編譯和連接方式一致的所有語言)

3、C和C++互相調用

我們既然知道extern "C"是實現的類C和C++的混合編程。下面我們就分別介紹如何在C++中調用C的代碼、C中調用C++的代碼。首先要明白C和C++互相調用,你得知道它們之間的編譯和連接差異,及如何利用extern "C"來實現相互調用。

3.1、C++的編譯和連接

C++是一個面向對象語言(雖不是純粹的面向對象語言),它支持函數的重載,重載這個特性給我們帶來了很大的便利。為了支持函數重載的這個特性,C++編譯器實際上將下面這些重載函數:

1
void print(int i);

2
void print(char c);

3
void print(float f);

4
void print(char* s);

編譯為:

1
_print_int

2
_print_char

3
_print_float

4
_pirnt_string

這樣的函數名,來唯一標識每個函數。註:不同的編譯器實現可能不一樣,但是都是利用這種機制。所以當連接是調用print(3)時,它會去查找_print_int(3)這樣的函數。下面說個題外話,正是因為這點,重載被認為不是多態,多態是運行時動態綁定(「一種介面多種實現」),如果硬要認為重載是多態,它頂多是編譯時「多態」。

C++中的變數,編譯也類似,如全局變數可能編譯g_xx,類變數編譯為c_xx等。連接是也是按照這種機制去查找相應的變數。

3.2、C的編譯和連接

C語言中並沒有重載和類這些特性,故並不像C++那樣print(int
i),會被編譯為_print_int,而是直接編譯為_print等。因此如果直接在C++中調用C的函數會失敗,因為連接是調用C中的print(3)時,它會去找_print_int(3)。因此extern
"C"的作用就體現出來了。

3.3、C++中調用C的代碼

假設一個C的頭文件cHeader.h中包含一個函數print(int i),為了在C++中能夠調用它,必須要加上extern關鍵字(原因在extern關鍵字那節已經介紹)。它的代碼如下:

1
#ifndef C_HEADER

2
#define C_HEADER

3

4
extern void print(int i);

5

6
#endif C_HEADER

相對應的實現文件為cHeader.c的代碼為:

1
#include <stdio.h>

2
#include "cHeader.h"

3
void print(int i)

4
{

5
printf("cHeader %d\n",i);

6
}

現在C++的代碼文件C++.cpp中引用C中的print(int i)函數:

1
extern "C"{

2
#include "cHeader.h"

3
}

4

5
int main(int argc,char** argv)

6
{

7
print(3);

8
return 0;

9
}

執行程序輸出:

3.4、C中調用C++的代碼

現在換成在C中調用C++的代碼,這與在C++中調用C的代碼有所不同。如下在cppHeader.h頭文件中定義了下面的代碼:

1
#ifndef CPP_HEADER

2
#define CPP_HEADER

3

4
extern "C" void print(int i);

5

6
#endif CPP_HEADER

相應的實現文件cppHeader.cpp文件中代碼如下:

1
#include "cppHeader.h"

2

3
#include <iostream>

4
using namespace std;

5
void print(int i)

6
{

7
cout<<"cppHeader "<<i<<endl;

8
}

在C的代碼文件c.c中調用print函數:

1
extern void print(int i);

2
int main(int argc,char** argv)

3
{

4
print(3);

5
return 0;

6
}

注意在C的代碼文件中直接#include "cppHeader.h"頭文件,編譯出錯。而且如果不加extern int print(int i)編譯也會出錯。

4、C和C++混合調用特別之處函數指針

當我們C和C++混合編程時,有時候會用一種語言定義函數指針,而在應用中將函數指針指向另一中語言定義的函數。如果C和C++共享同一中編譯和連接、函數調用機制,這樣做是可以的。然而,這樣的通用機制,通常不然假定它存在,因此我們必須小心地確保函數以期望的方式調用。

而且當指定一個函數指針的編譯和連接方式時,函數的所有類型,包括函數名、函數引入的變數也按照指定的方式編譯和連接。如下例:

01
typedef int (*FT) (const void* ,const void*);//style of C++

02

03
extern "C"{

04
typedef int (*CFT) (const void*,const void*);//style of C

05
void qsort(void* p,size_t n,size_t sz,CFT cmp);//style of C

06
}

07

08
void isort(void* p,size_t n,size_t sz,FT cmp);//style of C++

09
void xsort(void* p,size_t n,size_t sz,CFT cmp);//style of C

10

11
//style of C

12
extern "C" void ysort(void* p,size_t n,size_t sz,FT cmp);

13

14
int compare(const void*,const void*);//style of C++

15
extern "C" ccomp(const void*,const void*);//style of C

16

17
void f(char* v,int sz)

18
{

19
//error,as qsort is style of C

20
//but compare is style of C++

21
qsort(v,sz,1,&compare);

22
qsort(v,sz,1,&ccomp);//ok

23

24
isort(v,sz,1,&compare);//ok

25
//error,as isort is style of C++

26
//but ccomp is style of C

27
isort(v,sz,1,&ccopm);

28
}

注意:typedef int (*FT) (const void* ,const void*),表示定義了一個函數指針的別名FT,這種函數指針指向的函數有這樣的特徵:返回值為int型、有兩個參數,參數類型可以為任意類型的指針(因為為void*)。

最典型的函數指針的別名的例子是,信號處理函數signal,它的定義如下:

1
typedef void (*HANDLER)(int);

2
HANDLER signal(int ,HANDLER);

上面的代碼定義了信函處理函數signal,它的返回值類型為HANDLER,有兩個參數分別為int、HANDLER。 這樣避免了要這樣定義signal函數:

1
void (*signal (int ,void(*)(int) ))(int)

比較之後可以明顯的體會到typedef的好處。

7. IEC60870-5-104規約實現ARM和PC之間通信 怎樣編寫C程序 怎樣寫客戶端和伺服器端軟體來實現

可以加友,過程復雜,有酬勞可以考慮幫忙

8. 如何用c語言實現objective-c中的block語法

代碼塊本質上是和其他變數類似。不同的是,代碼塊存儲的數據是一個函數體。使用代碼塊是,你可以像調用其他標准函數一樣,傳入參數數,並得到返回值。
脫字元(^)是塊的語法標記。按照我們熟悉的參數語法規約所定義的返回值以及塊的主體(也就是可以執行的代碼)。下圖是如何把塊變數賦值給一個變數的語法講解:

按照調用函數的方式調用塊對象變數就可以了:
int result = myBlock(4); // result是 28

1、參數是NSString*的代碼塊

void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
{
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");
運行結果是:print:hello world!

2、代碼用在字元串數組排序

NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
NSComparator sortBlock = ^(id string1, id string2)
{
return [string1 compare:string2];
};
NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
NSLog(@"sortArray:%@", sortArray);

運行結果:sortArray:(

"abc 05",
"abc 1",
"abc 12",
"abc 13",
"abc 21"
)
3、代碼塊的遞歸調用
代碼塊想要遞歸調用,代碼塊變數必須是全局變數或者是靜態變數,這樣在程序啟動的時候代碼塊變數就初始化了,可以遞歸調用

static void (^ const blocks)(int) = ^(int i)
{
if (i > 0) {
NSLog(@"num:%d", i);
blocks(i - 1);
}
};
blocks(3);
運行列印結果:

num:3
num:2
num:1
4、在代碼塊中使用局部變數和全局變數
在代碼塊中可以使用和改變全局變數

int global = 1000;
int main(int argc, const char * argv[])
{
@autoreleasepool {
void(^block)(void) = ^(void)
{
global++;
NSLog(@"global:%d", global);
};
block();
NSLog(@"global:%d", global);
}
return 0;
}

運行列印結果:

global:1001
global:1001
而局部變數可以使用,但是不能改變。

int local = 500;
void(^block)(void) = ^(void)
{
// local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
在代碼塊中改變局部變數編譯不通過。怎麼在代碼塊中改變局部變數呢?在局部變數前面加上關鍵字:__block

__block int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
運行結果:local:501

local:501

9. C語言 鏈表中,怎麼判斷是頭指針啊。

一般來講,鏈表的每一個結點的類型是相同的,所以無法通過類型來判斷哪一個結點是頭結點。
但是,編程者都會把頭結點的地點保存到某個全局變數中,所以一般不存在不知道頭結點的內容的問題。
當然,如果你需要判斷任意結點是不是頭結點,可直接用其地址與頭結點地址相比較即可。

10. C語言編程的時候,怎麼分析一個題目用設麼結構關於網上的UML結構是什麽意思

多看看編程中的專業術語。。一般輸入輸出方式有區別
至於UML
統一建模語言,是用來對軟體密集系統進行可視化建模的一種語言。UML為面向對象開發系統的產品進行說明、可視化、和編制文檔的一種標准語言。統一建模語言 (UML)是非專利的第三代建模和規約語言。 UML是在開發階段,說明,可視化,構建和書寫一個面向對象軟體密集系統的製品的開放方法。UML展現了一系列最佳工程實踐,這些最佳實踐在對大規模,復雜系統進行建模方面,特別是在軟體架構層次已經被驗證有效。UML被OMG採納作為業界的標准。UML最適於數據建模,業務建模,對象建模,組件建模。

熱點內容
有幾家java培訓機構 發布:2025-01-11 13:55:05 瀏覽:472
搭建個人伺服器缺點 發布:2025-01-11 13:54:13 瀏覽:372
怎麼用安卓的手機登錄ios第五人格 發布:2025-01-11 13:44:11 瀏覽:765
登陸Ftp重輸密碼 發布:2025-01-11 13:40:12 瀏覽:331
解壓神器有氧射擊 發布:2025-01-11 13:33:04 瀏覽:851
百度雲的好友在哪個文件夾 發布:2025-01-11 13:32:13 瀏覽:746
2級c語言試題 發布:2025-01-11 13:09:21 瀏覽:939
rft屏幕代碼編譯 發布:2025-01-11 12:54:01 瀏覽:743
安卓手機怎麼清除後台 發布:2025-01-11 12:53:14 瀏覽:805
sgm郵箱伺服器地址 發布:2025-01-11 12:46:03 瀏覽:884