第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

C函數(shù)調用中的默認參數(shù)提升

C函數(shù)調用中的默認參數(shù)提升

C
德瑪西亞99 2019-06-28 14:51:42
C函數(shù)調用中的默認參數(shù)提升設置對于C中調用函數(shù)時的默認參數(shù)升級,我有幾個問題。這里的6.5.2.2節(jié)“函數(shù)調用”第6、7和8段來自C99標準(Pdf)(為便于閱讀,增加并細分為清單):第6段如果表示被調用函數(shù)的表達式具有以下類型不包括原型,則對每個參數(shù)和具有類型的參數(shù)執(zhí)行整數(shù)提升。float升為double..這些叫做默認參數(shù)提升.如果參數(shù)不等于參數(shù),則行為未定義。如果函數(shù)是用以下類型定義的包括一個原型,或者原型以省略號結尾(, ...)或者升級后的參數(shù)類型與參數(shù)的類型不兼容,則行為是未定義的。如果函數(shù)是用以下類型定義的不包括原型,而且升級后的參數(shù)類型與升級后的參數(shù)類型不兼容,除下列情況外,行為未定義:一種提升類型是有符號整數(shù)類型,另一種提升類型是對應的無符號整數(shù)類型,該值在這兩種類型中都是可表示的;這兩種類型都是指向字符類型或void.第7段如果表示被調用函數(shù)的表達式具有以下類型包括一個原型,參數(shù)被隱式轉換,就像通過賦值一樣,轉換為相應參數(shù)的類型,將每個參數(shù)的類型作為其聲明類型的非限定版本。函數(shù)原型聲明器中的省略符號將導致在上次聲明參數(shù)之后停止參數(shù)類型轉換。默認的參數(shù)提升是對尾隨參數(shù)執(zhí)行的。第8段不隱式執(zhí)行其他轉換;特別是,參數(shù)的數(shù)量和類型不能與函數(shù)定義中的參數(shù)進行比較。不包括函數(shù)原型聲明器。.我所知道的這個默認參數(shù)提升是char和short到int/unsigned int和float到double變量函數(shù)的可選參數(shù)(如printf)是否受默認參數(shù)提升的限制。作為記錄,我的理解是功能原型這是:void func(int a, char b, float c);  // Function prototypevoid func(int a, char b, float c) { /* ... */ }  // Function definition問題這一切都讓我很難受。以下是我的一些問題:原型函數(shù)和非原型函數(shù)的行為真的有很大的不同嗎,比如在默認升級和隱式轉換方面?默認參數(shù)提升何時發(fā)生?總是這樣嗎?或者僅僅是在特殊情況下(比如各種函數(shù))?它是否取決于一個函數(shù)是否是原型的?
查看完整描述

3 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

UPDATED AProgrammer的回答-這些才是真正的商品。

對于那些想知道為什么情況是這樣的:在1988年以前的黑暗時代,在經典的“K&R”C中沒有函數(shù)原型這樣的東西,默認的論點推廣是因為(A)基本上是“免費”的,因為在寄存器中放置一個字節(jié)比在寄存器中放一個單詞要花費更多的錢,以及(B)減少參數(shù)傳遞中可能出現(xiàn)的錯誤。第二個原因并沒有完全消除它,這就是為什么在ANSI C中引入功能原型是C語言中最重要的變化。

至于默認促銷何時開始:當參數(shù)的預期類型為未知數(shù),也就是說,當沒有原型的時候,或者爭論是不同的。


查看完整回答
反對 回復 2019-06-28
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

  • (非變量)參數(shù)與原型函數(shù)的參數(shù)轉換為相應的類型,這種類型可以是char、Short、Float。

  • 沒有原型和可變參數(shù)的函數(shù)的參數(shù)受默認參數(shù)提升的影響。

如果使用Prototype定義函數(shù)并使用它而不使用Prototype,反之亦然,并且它具有char、Short或Float類型的參數(shù),那么在運行時可能會出現(xiàn)問題。如果提升類型與讀取參數(shù)列表時使用的類型不匹配,則變量函數(shù)將遇到相同的問題。

示例1:用原型定義函數(shù)并不使用它時的問題。

定義c

void f(char c){
   printf("%c", c);}

使用.c

void f();int main(){
   f('x');}

可能會失敗,因為一個int將被傳遞,并且函數(shù)需要一個char。

示例2:在沒有原型的情況下定義函數(shù)并將其與原型一起使用時的問題。

定義c

void f(c)
   char c;{
   printf("%c", c);}

(這是一種很老套的定義)

使用.c

void f(char c);int main(){
   f('x');}

可能會失敗,因為需要一個int,但會傳遞一個字符。

注意:您會注意到,標準庫中的所有函數(shù)都有默認升級導致的類型。因此,當添加原型時,它們不會在轉換過程中引起問題。


查看完整回答
反對 回復 2019-06-28
?
絕地無雙

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

您的困惑源于對術語的非常輕微的誤解-聲明和定義都可以包括原型(或不包括):

void func(int a, char b, float c);

那是一個函數(shù)聲明包括一個原型。

void func(int a, char b, float c) { /* ... */ }

那是一個函數(shù)定義包括一個原型。

“原型”和“非原型”只是函數(shù)的屬性。類型,而聲明和定義都引入了函數(shù)的類型。

因此,您可以在沒有原型的情況下進行聲明:

void func();

或者,您可以使用沒有原型的定義(K&R&C風格):

void func(a, b, c)
    int a;
    char b;
    float c;{ /* ... */ }


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 530 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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