2016-09-17 1 views
-4
#include<stdio.h> 

void fun(z) 
{ 
    printf("%d",z); 
} 
int main() 
{ 
    int a=5; 
    fun(a); 
} 

Это дает выход в 5. Не должен давать ошибку - необъявленной переменной г?В C почему параметр, передаваемый в функцию ничтожной компилируется в то время как он должен выдавать ошибку

Является ли это оптимизацией компилятора?

+2

Древний C имеет неявный тип 'int'. – EOF

+0

'z' не 'не объявлен'. Это параметр функции (и его тип неявно «int»). –

+0

Никогда не пишите такой код! Получите C-книгу о ** modern ** C (которая началась 17 лет назад с C99). И 'z', очевидно **, объявлен ** доисторическим путем. Компилятор должен предупредить. Если нет: ** всегда ** включите, по крайней мере, рекомендуемые предупреждения и обратите внимание на них. – Olaf

ответ

1

Это не оптимизация компилятора, это соответствие древнему соглашению C, которое позволяет пропустить переменные и типы параметров, когда нужный тип - int. Это соглашение предшествует стандарту ANSI, и его следует избегать, даже если ваш компилятор в порядке с таким кодом.

Вы получите предупреждение, если сообщите компилятору, что вы хотите, чтобы ваш код соответствовал одному из более современных стандартов, скажем, C99 или C11. Флаг зависит от компилятора. Если вы используете gcc, добавьте

-std=c99 

флаг, чтобы увидеть предупреждение.