2016-06-26 4 views
-2

я прекрасно понимаю, о том, как Е() и спецификатор формата работыЕ() и спецификатор формата ссылки

ПРИМЕЧАНИЕ: - Я использую Turbo C/C++ компилятор и вы си знаете GCC, г ++, и т.д. путь лучше, но проблема остается тем же

код: -

void main() 
{ 
clrscr(); 
printf("%d %d %d"); 
getch(); 
} 

выход: - 0 344 0

теперь

код: -

void main() 
{ 
clrscr(); 
printf("%f %f %f"); 
getch(); 
} 

выход: - Printf: форматы с плавающей запятой не связаны аварийное завершение программы.

сейчас, также обратите внимание, что я пробовал это примерно на 200 системах.

Вопрос: -Я считаю, что эти номера спецификаторов формата, отображаемые на выходе, не являются мусором, так как для каждой системы получается один и тот же результат, а также их связь между функцией printf() и спецификатором формата с помощью обработки файлов или указателя , Так может теперь кто-нибудь наконец сказать, что это может быть?

примечание: -результат может отличаться от IDE к IDE, но он такой же для компилятора на каждой системе, как я пробовал это также в кодовых блоках IDE.

+1

«Я считаю, что эти номера спецификаторов формата, отображаемые на выходе, не являются мусором» - вы вызываете * неопределенное поведение *. Вера - это единственное, что вам нужно, потому что все остальное уже вышло из окна. – WhozCraig

+2

Это неопределенное поведение. Вы используете спецификаторы формата, которые требуют дополнительных аргументов, но вы не можете их предоставить. Таким образом, вы получаете неуказанный мусор. Вы также неправильно объявляете 'main'. Он возвращает 'int' и должен быть объявлен как таковой. –

+0

как я сказал, что я проверил это на большом нет. систем, поэтому да, я считаю, что результат для всех систем для обоих компиляторов был таким же, как и компилятор turbo c, на самом деле является компилятором borland c, созданным Деннисом Ритчи и отредактированным людьми в Борланде, и согласно ANSI C main может иметь недействительный тип возврата. – NeoR

ответ

4

Так может кто-нибудь теперь наконец сказать, что это может быть?

C11 Standard (draft) for the library function fprintf() Из:

7.21.6.1/2

[...]

Если нет достаточных аргументов для формата, поведение не определено ,

После того, как код вызвал неопределенное поведение ничего могло случиться.

+0

Я понимаю, что, хотя в проекте говорится, что не должен меняться в разных системах, тогда я мог бы понять неопределенное поведение, и у меня есть понимание дизайна компилятора, поэтому я рассматриваю его как неопределенный автомат в дизайне компилятора. – NeoR

0

вывод: - printf: форматы с плавающей запятой не связаны Аномальное завершение программы.

Turbo C и некоторые компиляторы не ссылаются в поддержку с плавающей точкой, если код с плавающей точкой не обнаружен в пользовательском коде. "%f %f %f" нуждается в поддержке FP для работы, но компилятор не узнает его на компиляции времени. Вместо этого программа завершается с ошибкой запустите раз.

Добавить код FP и избавиться от другого неправильного использования printf();

#include <stdio.h> 
#include <math.h> 
int main() { 
    clrscr(); 
    double a = sqrt(2.0): 
    printf("%f %f %f\n",a,a,a); 
    getch(); 
}