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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

函數(shù)語(yǔ)法,參數(shù)列表后聲明的參數(shù)類型

函數(shù)語(yǔ)法,參數(shù)列表后聲明的參數(shù)類型

C
幕布斯6054654 2019-07-06 17:42:36
函數(shù)語(yǔ)法,參數(shù)列表后聲明的參數(shù)類型我對(duì)C比較陌生。我遇到了一種以前從未見(jiàn)過(guò)的函數(shù)語(yǔ)法,在參數(shù)列表之后定義了參數(shù)類型。有人能向我解釋一下它與典型的C函數(shù)語(yǔ)法有何不同嗎?例子:int main (argc, argv)int argc;char *argv[];{return(0);}
查看完整描述

3 回答

?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

這是參數(shù)列表的舊式語(yǔ)法,它仍然被支持。在K&R C中,您還可以關(guān)閉類型聲明,它們將默認(rèn)為int。E.

main(argc, argv)char *argv[];{
    return 0;}

同樣的功能。


查看完整回答
反對(duì) 回復(fù) 2019-07-06
?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊

同樣有趣的是函數(shù)調(diào)用約定的差異,以及沒(méi)有原型的函數(shù)??紤]一下舊的風(fēng)格定義:

void f(a)
 float a; {
 /* ... */}

在這種情況下,調(diào)用約定是在傳遞給函數(shù)之前提升所有參數(shù)。所以如果f接收double但是參數(shù)有類型float(這是完全有效的)編譯器必須發(fā)出代碼,在執(zhí)行函數(shù)的主體之前將Double轉(zhuǎn)換為Float。

如果您包含一個(gè)原型,編譯器將不再進(jìn)行這種自動(dòng)提升,傳遞的任何數(shù)據(jù)都會(huì)轉(zhuǎn)換為原型參數(shù)的類型,就像通過(guò)賦值一樣。因此,以下行為是不合法的,會(huì)導(dǎo)致未定義的行為:

void f(float a);void f(a)
  float a; {}

在這種情況下,函數(shù)的定義將提交的參數(shù)轉(zhuǎn)換為double(晉升表格)float因?yàn)槎x是舊的。但該參數(shù)是作為浮點(diǎn)數(shù)提交的,因?yàn)樵摵瘮?shù)有一個(gè)原型。你們解決矛盾的辦法有以下兩種:

// option 1void f(double a);void f(a)
  float a; {}// option 2// this declaration can be put in a header, but is redundant in this case, 
  // since the definition exposes a prototype already if both appear in a 
  // translation unit prior to the call. void f(float a); void f(float a) {}

如果您有選擇的話,應(yīng)該首選選項(xiàng)2,因?yàn)樗梢灶A(yù)先消除舊的樣式定義。如果函數(shù)的這種矛盾函數(shù)類型出現(xiàn)在同一個(gè)轉(zhuǎn)換單元中,編譯器通常會(huì)告訴您(但不是必需的)。如果這樣的矛盾出現(xiàn)在多個(gè)翻譯單位,錯(cuò)誤可能會(huì)被忽視,并可能導(dǎo)致很難預(yù)測(cè)錯(cuò)誤。最好避免使用這些舊的樣式定義。


查看完整回答
反對(duì) 回復(fù) 2019-07-06
?
婷婷同學(xué)_

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊

雖然函數(shù)定義的舊語(yǔ)法仍然有效(如果您問(wèn)編譯器,有警告),但使用它們并不提供函數(shù)原型。
如果沒(méi)有函數(shù)原型,編譯器將不會(huì)檢查函數(shù)是否被正確調(diào)用。

#include <stdio.h>int foo(c)int c;{ return printf("%d\n", c); }int bar(x)double x;{ return printf("%f\n", x); }int main(void){
    foo(42); /* ok */
    bar(42); /* oops ... 42 here is an `int`, but `bar()` "expects" a `double` */
    return 0;}

當(dāng)程序運(yùn)行時(shí),我的機(jī)器上的輸出是

$ gcc proto.c
$ gcc -Wstrict-prototypes proto.c
proto.c:4: warning: function declaration isn’t a prototype
proto.c:10: warning: function declaration isn’t a prototype
$ ./a.out
42
0.000000


查看完整回答
反對(duì) 回復(fù) 2019-07-06
  • 3 回答
  • 0 關(guān)注
  • 523 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)