Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значащие символы в имени переменной (язык C) 
:(
    Опции темы
Compositum
Дата 11.5.2011, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Читаю Кернигана и Ритчи.
Цитата

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

Выкладываю свой код, посредством которого смотрю, что подразумевается под "значащими" символами:
Код

//11.05.2011
//Изучаю, что значит "значащее" имя переменной
#include<stdio.h>

main()
{
    //Создаю две переменные с очень длинными именами
    int moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_1;
    int moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_2;

    //Теперь буду им присваивать различные значения и проверять их    
    
    printf("Назначаю первой значение 100, а второй 200\n");    

    moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_1 = 100;
    moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_2 = 200;
    
    printf("Значение первой переменной: %d\n", moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_1);
    printf("Значение второй переменной: %d\n\n", moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_2);
    
    printf("Назначаю первой значение 300\n");    
    moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_1 = 300;

    printf("Значение первой переменной: %d\n", moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_1);
    printf("Значение второй переменной: %d\n\n", moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_2);

    printf("Назначаю второй значение 400\n");
    moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_2 = 400;

    printf("Значение первой переменной: %d\n", moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_1);
    printf("Значение второй переменной: %d\n", moja_samaja_vazhnaja_peremennaja_iz_vseh_uzhe_imejuwihsja_2);
}

Результат работы кода:
Цитата(Терминал)

bush@mycomp:~/Training/C/C89/mytests$ gcc VarNamesLen.c -o VarNamesLen.out
bush@mycomp:~/Training/C/C89/mytests$ ./VarNamesLen.out
Назначаю первой значение 100, а второй 200
Значение первой переменной: 100
Значение второй переменной: 200

Назначаю первой значение 300
Значение первой переменной: 300
Значение второй переменной: 200

Назначаю второй значение 400
Значение первой переменной: 400
Значение второй переменной: 200
bush@mycomp:~/Training/C/C89/mytests$

Т.о. при первичной инициализации значения были присвоены верно (100 и 200). Но когда я пытаюсь второй переменной присвоить значение 400, оно по факту присваивается первой переменной.

Если я нигде не ошибся, то не понимаю, почему было не задать в стандарте C89/C99 ограничение на длину имён переменных, если существует опасность неверного присваивания значений? Понимаю, что вопрос не по адресу, поэтому он скорее риторический...
PM   Вверх
alexvs11
Дата 11.5.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



видимо нечто вроде undefined behavior
а какой компилятор, gcc нормально отработал
PM MAIL   Вверх
Compositum
Дата 11.5.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(alexvs11 @ 11.5.2011,  21:08)
видимо нечто вроде undefined behavior
а какой компилятор, gcc нормально отработал

я разве писал, что компилятор не отработал? Всё прекрасно скомпилировалось без замечаний. Компилятор - gcc.

Это сообщение отредактировал(а) Compositum - 11.5.2011, 21:16
PM   Вверх
mes
Дата 11.5.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Compositum @  11.5.2011,  20:15 Найти цитируемый пост)
Всё прекрасно скомпилировалось без замечаний. 

может стоит пользоваться чем то более свежом чем 20 летняя версия ?

Добавлено через 28 секунд
Цитата(Compositum @  11.5.2011,  19:25 Найти цитируемый пост)
C89/




--------------------
PM MAIL WWW   Вверх
Compositum
Дата 11.5.2011, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(mes @ 11.5.2011,  21:48)
Цитата(Compositum @  11.5.2011,  20:15 Найти цитируемый пост)
Всё прекрасно скомпилировалось без замечаний. 

может стоит пользоваться чем то более свежом чем 20 летняя версия ?

Добавлено @ 21:48
Цитата(Compositum @  11.5.2011,  19:25 Найти цитируемый пост)
C89/

Я изучаю С. По этому языку всего два стандарта, кои я и обозначил в первом посте. В gcc полностью реализован только C89. Стандарт C99 в нём реализован не полностью. Кроме того, книга обозначенных мною авторов (Кернигана и Ритчи) по C89.
Сейчас я учу C89 и это не обсуждается, C99 будет следующим.
PM   Вверх
kemiisto
Дата 11.5.2011, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Compositum @  11.5.2011,  20:57 Найти цитируемый пост)
Сейчас я учу C89 и это не обсуждается, C99 будет следующим. 

А можно всё-таки обсудить? smile У меня прямой вопрос. Какую цель Вы преследуете, начиная изучать С в 2011 году?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Compositum
Дата 11.5.2011, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(kemiisto @ 11.5.2011,  22:01)
Цитата(Compositum @  11.5.2011,  20:57 Найти цитируемый пост)
Сейчас я учу C89 и это не обсуждается, C99 будет следующим. 

А можно всё-таки обсудить? smile У меня прямой вопрос. Какую цель Вы преследуете, начиная изучать С в 2011 году?

Мне интересен этот язык, поскольку на нём написаны Linux API и WinAPI.
PM   Вверх
mes
Дата 11.5.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Compositum @  11.5.2011,  20:57 Найти цитируемый пост)
Сейчас я учу C89 и это не обсуждается,

тогда принимайте его таким каким он есть и.. перейдя к ограничением на внешние имена,  увидите что 31 еще ой как много  smile

Добавлено через 46 секунд
ну а причина по сути лежит не в компиляторе, а линкере.. 


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 12.5.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



странный у тебя компилятор...
MSVC 2008:
Цитата

Назначаю первой значение 100, а второй 200
Значение первой переменной: 100
Значение второй переменной: 200

Назначаю первой значение 300
Значение первой переменной: 300
Значение второй переменной: 200

Назначаю второй значение 400
Значение первой переменной: 300
Значение второй переменной: 400

Вот, насколько я знаю, gcc 4.6:
http://liveworkspace.org/code/25de2e5e1c2e...431edc9a62eea39


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 12.5.2011, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(mes @  11.5.2011,  23:30 Найти цитируемый пост)
ну а причина по сути лежит не в компиляторе, а линкере..

это почему? там ведь никаких вызовов нет, обычное присвоение, причем там линкер?
PM MAIL   Вверх
mes
Дата 12.5.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(asmdzen @  12.5.2011,  07:47 Найти цитируемый пост)
это почему? там ведь никаких вызовов нет, обычное присвоение, причем там линкер? 

не причина ошибки, а причина почему в стандарте ввели ограничение на "длину имени" :
Цитата

 * 31 significant initial characters in an internal identifier or a
   macro name

 * 6 significant initial characters in an external identifier 

которое в последствии изменилось на :
Цитата

For internal names, all characters are significant. For external names, the number of significant characters are defined by the linker; for almost all targets, all characters are significant.

поэтому вышеприведенный пример на современных компиляторах ошибки не даст.. 
smile


--------------------
PM MAIL WWW   Вверх
Compositum
Дата 12.5.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(mes @ 12.5.2011,  09:06)
поэтому вышеприведенный пример на современных компиляторах ошибки не даст.. 
smile

Я недавно показывал в одном из своих топиков версию имеющегося у меня компилятора:
Цитата(Терминал)

bush@mycomp:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=x86_64-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/x86_64-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/x86_64-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 

Как видим - он и есть современный.
PM   Вверх
borisbn
Дата 12.5.2011, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Compositum @  12.5.2011,  09:25 Найти цитируемый пост)
Я недавно показывал в одном из своих топиков версию имеющегося у меня компилятора:

да помню. там была разница в том, что ты компилируешь Си, а не Си++, однако, вот gcc на Си
http://liveworkspace.org/code/3ed8607028bf...4f1670e97ec3f97
на MSVC 2008 при компиляции Си (а не Си++) то же самое...
Может у тебя какие-то хитрые настройки компилятора ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 12.5.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 12.5.2011,  09:36)
Цитата(Compositum @  12.5.2011,  09:25 Найти цитируемый пост)
Я недавно показывал в одном из своих топиков версию имеющегося у меня компилятора:

да помню. там была разница в том, что ты компилируешь Си, а не Си++, однако, вот gcc на Си
http://liveworkspace.org/code/3ed8607028bf...4f1670e97ec3f97
на MSVC 2008 при компиляции Си (а не Си++) то же самое...
Может у тебя какие-то хитрые настройки компилятора ?

я ничего нигде не изменял, ибо уровень не тот - только учусь самому С, в настройки компилятора пока не лезу (рано).
PM   Вверх
mes
Дата 12.5.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Compositum @  12.5.2011,  08:53 Найти цитируемый пост)
я ничего нигде не изменял, 

но при компиляции же задаете -std=c89 (c90) или -ansi ..  smile 

Это сообщение отредактировал(а) mes - 12.5.2011, 10:05


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.