Присвоение «строки» переменной, ранее объявленной как «int» - PullRequest
0 голосов
/ 18 января 2019

Я новичок в программировании и в изучении динамической типизации на python, это вызывает сомнения в "статической типизации". Я опробовал этот код (присвоение строки целочисленной переменной, которая была ранее объявлена) и печать переменной как printf(var_name) и ее вывод; Кто-нибудь может объяснить это понятие?

#include<stdio.h>
#include<conio.h>
void main()
{
    int i = 20 ;
    i = "hello";
    printf(i);
}

1 Ответ

0 голосов
/ 18 января 2019

Помимо того, что ваш вопрос может быть дубликатом, позвольте мне добавить кое-что, что отсутствует в прочитанном достойном ответе https://stackoverflow.com/a/430414/3537677

C строго / статически типизировано, но слабо проверено

Это одна из самых больших базовых функций языка, которая отличает C от других языков, таких как C ++. (Какие люди привыкли просто ошибаться "C с классами"

То есть, хотя C имеет сильную систему типов в контексте необходимости и использования ее для определения размеров типов во время компиляции, языки C не имеют системы типов для проверки их на неправильное использование. Таким образом, компиляторы не обязаны проверять это и не могут ошибаться в вашем коде, потому что это допустимый код C. Современные компиляторы выдают тестовое предупреждение.

Компиляторы C обеспечивают только «систему типов» для упомянутого управления размером. Это означает, что если вы просто наберете int i = 42;, эта переменная имеет так называемую продолжительность автоматического хранения или то, что многие люди более или менее правильно называют «стеком». Это означает, что компилятор позаботится о том, чтобы освободить место для переменной и очистить ее. Если он не может знать его размер, но нуждается в этом, тогда он действительно выдаст ошибку. Но это можно обойти, если делать что-то во время выполнения и использовать типы без каких-либо типов, то есть указатели и void* или void-указатели.

Относительно вашего кода

Ваш код, похоже, старый нестандартный компилятор C, судя по #include<conio.h> и void, возвращающим main. С помощью нескольких модификаций вы можете скомпилировать ваш код, но, вызывая printf со строкой недопустимого формата, вы вызываете так называемое неопределенное поведение (UB), то есть оно может работать на вашем компьютере, но вылетает на мой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...