2016-02-19 31 views
3

爲什麼這個Code在整個聲明的中間無處(中間函數定義),不拋出錯誤?爲什麼在其函數定義之外聲明的函數變量不會引發錯誤?

1)爲什麼它在語法上是正確的。
2)這樣做有什麼用處?


#include <stdio.h> 
void func(int, int); 
int main() 
{ 
    int a, b; 
    a = 10; 
    b = 20; 
    func(a, b); 

    return 0; 
} 
void func(i, j) 
int i,j;     //why does this doesn't throw error. 
{ 
    printf("a = i = %d\nb = j = %d\n", i, j); 
} 
+0

正如以下回答,它在語法上是正確的,因爲它是有效的 - 這是事情完成的原始方式。現在沒有任何使用這種語法的方法,除非你碰巧使用了不支持ANSI C的K&R風格的編譯器。 – mah

+0

而不是** EVER **爲K&R風格定義的函數提供原型。爲了找出原因,在函數原型和定義中將'int'更改爲'char'。 –

回答

3

TL; DR - K &ř風格。

在你的代碼

void func(i, j) 
int i,j; { 

不拋出一個錯誤,因爲它一個(唯一)有效的語法,仙界。

目前它是無效,但不再使用。

如果需要,您可以閱讀更多關於K&R style syntax here的信息。

1

void func(i, j) 
int i,j; //declare types of arguments 
{ 
    //function body 
} 

被稱爲K&R語法。它已經過時,但仍用於一些C項目,如bash

相關問題