亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該更喜歡常量而不是定義嗎?

我應該更喜歡常量而不是定義嗎?

C
江戶川亂折騰 2019-12-26 14:14:04
在C語言中,我是否更喜歡常量而不是定義?最近,我閱讀了很多代碼,所有示例都大量使用了定義。
查看完整描述

3 回答

?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

不,通常,您不應該在C中使用const限定對象來創建名稱常量。為了在C語言中創建命名常量,您應該使用宏(#define)或枚舉。實際上,就您所暗示的意義而言,C語言沒有常量。(在這方面,C與C ++明顯不同)


在C語言中,常量和常量表達的概念與C ++的定義非常不同。在C中,常數表示文字值,例如123。這是C 中常量的一些示例


123

34.58

'x'

C中的常量可用于構建常量表達式。但是,由于任何類型的const限定對象都不是C中的常量,因此無法在常量表達式中使用它們,因此,您不能在需要使用常量表達式的情況下使用const限定對象。


例如,以下不是常數


const int C = 123; /* C is not a constant!!! */

并且由于上述C內容不是常量,因此不能用于在文件范圍內聲明數組類型


typedef int TArray[C]; /* ERROR: constant expression required */

不能用作案例標簽


switch (i) {

  case C: ; /* ERROR: constant expression required */

}

不能用作位域寬度


struct S {

  int f : C; /* ERROR: constant expression required */

};

它不能用作具有靜態存儲持續時間的對象的初始化程序


static int i = C; /* ERROR: constant expression required */

它不能用作枚舉初始化器


enum {

  E = C /* ERROR: constant expression required */

};

即它不能在需要常量的任何地方使用。


這似乎違反直覺,但這是C語言定義的方式。


這就是為什么您#define在使用的代碼中看到大量的-s的原因。同樣,在C語言中,const限定對象的使用非常有限。它們基本上完全沒有用做“常量”,這就是為什么在C語言中,您基本上不得不使用#define或枚舉來聲明真正的常量。


當然,在使用const限定對象為您工作時(即它按您的意愿進行工作)的情況下,由于在范圍和類型方面,它確實在許多方面優于宏。在適用的情況下,您可能應該首選此類對象,但是在一般情況下,您必須考慮上述限制。


查看完整回答
反對 回復 2019-12-26
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

常量比defines 更可取。有幾個優點:

  • 類型安全。盡管C是弱類型語言,但是使用C會define失去所有類型安全性,這將使編譯器為您解決問題。

  • 易于調試。您可以通過調試器更改常量的值,而define預處理器會在代碼中自動將s更改為實際值,這意味著如果要出于測試/調試目的更改值,則需要重新編譯。


查看完整回答
反對 回復 2019-12-26
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

也許我一直在錯誤地使用它們,但是至少在gcc中,不能在case語句中使用常量。


const int A=12;

switch (argc) {

    case A:

    break;

}


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 612 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號