Запитання з тегом «language-lawyer»

Питання щодо тонкощів формальних чи авторитетних специфікацій мов програмування та середовищ.

7
Плутанина щодо ініціалізації масиву в C
На мові C, якщо ініціалізувати такий масив: int a[5] = {1,2}; тоді всі елементи масиву, які явно не ініціалізовані, будуть ініціалізовані неявно нулями. Але якщо я ініціалізую такий масив: int a[5]={a[2]=1}; printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]); вихід: 1 0 1 0 0 Я не розумію, чому …

4
Чи можлива нульова посилання?
Чи дійсний цей фрагмент коду (та визначена поведінка)? int &nullReference = *(int*)0; Обидва г ++ і брязкіт ++ компіляція без якого - або попередження, навіть при використанні -Wall, -Wextra, -std=c++98, -pedantic, -Weffc++... Звичайно, посилання насправді не є нульовим, оскільки до нього не можна отримати доступ (це означатиме перенаправлення нульового вказівника), …

8
Є "інше якщо" одним ключовим словом?
Я новачок у С ++. Я часто бачу умовне твердження, як нижче: if statement_0; else if statement_1; Питання: Синтаксично , чи слід розглядати це else ifяк одне ключове слово? Або це насправді вкладене ifтвердження у зовнішньому, elseяк нижче? if statement_0; else if statement_1;

7
Як може працювати програма з глобальною змінною, яка називається main замість основної функції?
Розглянемо наступну програму: #include <iostream> int main = ( std::cout << "C++ is excellent!\n", 195 ); Використовуючи g ++ 4.8.1 (mingw64) в ОС Windows 7, програма компілює та працює добре, друкуючи: C ++ відмінна! до консолі. mainвидається глобальною змінною, а не функцією; як ця програма може виконуватись без функції main()? …

2
Чи має цей код із розділу 36.3.6 четвертого видання “Мова програмування C ++” чітко визначену поведінку?
У розділі STL-подібних операцій 4-го випуску мови програмування на мові програмування C ++ Бьярна Струструпа такий код використовується як приклад ланцюжка :36.3.6 void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ), 4, …

3
Друк нульових покажчиків з% p є невизначеною поведінкою?
Це невизначена поведінка для друку нульових покажчиків за допомогою %pспецифікатора перетворення? #include <stdio.h> int main(void) { void *p = NULL; printf("%p", p); return 0; } Питання стосується стандарту С, а не реалізації С.

8
Ефективний непідписаний підпис, уникаючи поведінки, визначеної реалізацією
Я хочу визначити функцію, яка приймає unsigned intяк аргумент і повертає до аргументу intконгруентний модуль UINT_MAX + 1. Перша спроба може виглядати так: int unsigned_to_signed(unsigned n) { return static_cast<int>(n); } Але, як відомо будь-якому мовному юристу, приведення з непідписаного на підписане значення, більші за INT_MAX, визначається реалізацією. Я хочу реалізувати …

3
Коли інформація про тип рухається назад у C ++?
Я щойно спостерігав, як Стефан Т. Лававей виступав на темі CppCon 2018"Відрахування аргументів шаблону класу", де в якийсь момент він випадково каже: У типі C ++ інформація майже ніколи не тече назад ... Мені довелося сказати "майже", тому що є один або два випадки, можливо, більше, але дуже мало . …

4
Чому (лише) деякі компілятори використовують одну і ту ж адресу для однакових рядкових літералів?
https://godbolt.org/z/cyBiWY Я бачу два 'some'літерали в коді асемблера, згенерованому MSVC, але лише один із clang та gcc. Це призводить до абсолютно різних результатів виконання коду. static const char *A = "some"; static const char *B = "some"; void f() { if (A == B) { throw "Hello, string merging!"; } …

3
Коли приватний конструктор не є приватним конструктором?
Скажімо, у мене є тип, і я хочу зробити його конструктор за замовчуванням приватним. Я пишу наступне: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error …

2
Коли зайві дужки впливають, крім переваги оператора?
Дужки в C ++ використовуються в багатьох місцях: наприклад, у викликах функцій та групуванні виразів, щоб замінити пріоритет оператора. Окрім незаконних зайвих дужок (наприклад, навколо списків аргументів викликів функцій), загальним, але не абсолютним правилом С ++ є те, що зайві дужки ніколи не зашкодять : 5.1 Первинні вирази [expr.prim] 5.1.1 …

2
Помилка під час використання в класі ініціалізації нестатичного члена даних та конструктора вкладеного класу
Наступний код досить тривіальний, і я очікував, що він повинен скомпілюватись добре. struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; Я протестував цей код за допомогою g ++ версії 4.7.2, 4.8.1, clang ++ 3.2 та 3.3. …


8
Чи можна вважати гілки з невизначеною поведінкою недосяжними та оптимізувати їх як мертвий код?
Розглянемо наступне твердження: *((char*)NULL) = 0; //undefined behavior Він чітко посилається на невизначену поведінку. Чи означає існування такого твердження в даній програмі, що вся програма невизначена, або що поведінка стає невизначеною лише після того, як потік управління потрапить у це твердження? Чи буде наступна програма чітко визначена на випадок, якщо …

3
Коли слід використовувати @classmethod, а коли def метод (self)?
Під час інтеграції програми Django, якою я раніше не користувався, я знайшов два різні способи, що використовуються для визначення функцій у класах. Автор, схоже, використовує їх обох дуже навмисно. Перший - це той, яким я сам часто користуюся: class Dummy(object): def some_function(self,*args,**kwargs): do something here self is the class instance …

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.