Запитання з тегом «c»

C - мова програмування загального призначення, що використовується для системного програмування (ОС та вбудованих), бібліотек, ігор та крос-платформ. Цей тег слід використовувати із загальними питаннями, що стосуються мови C, визначеної стандартом ISO 9899 (остання версія, 9899: 2018, якщо інше не зазначено - також запити, пов’язані з версією тегів c89, c99, c11 тощо). C відрізняється від C ++, і він не повинен поєднуватися з тегом C ++ без раціональної причини.

5
Чому твердження без ефекту вважаються законними в С?
Пробачте, якщо це питання є наївним. Розглянемо наступну програму: #include <stdio.h> int main() { int i = 1; i = i + 2; 5; i; printf("i: %d\n", i); } У наведеному вище прикладі, оператори 5;і i;здаються абсолютно зайвими, але код компілюється без попереджень або помилок за замовчуванням (проте, ПКУ робить …
13 c 

5
Порівнюючи трохи з булевим
Скажіть, у мене є набір прапорів, закодованих у uint16_t flags. Наприклад, AMAZING_FLAG = 0x02. Тепер у мене є функція. Цю функцію потрібно перевірити, чи хочу я змінити прапор, тому що якщо я хочу це зробити, мені потрібно записати у спалах. І це дорого. Тому я хочу чек, який підказує мені, …

1
Чому час, про який повідомляється часом (), іноді на 1 секунду відстає секунда компонент timespec_get () у коді C?
Наступний фрагмент коду: struct timespec ts; for (int x = 0; x < 100000000; x++) { timespec_get(&ts, TIME_UTC); long cTime = (long) time(NULL); if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) { printf("cTime: %ld\n", cTime); printf("ts.tv_sec: %ld\n", ts.tv_sec); printf("ts.tv_nsec: %ld\n", ts.tv_nsec); } } виробляє цей вихід: ... cTime: 1579268059 ts.tv_sec: …
12 c  time  posix  timespec 

4
Чому ця функція повертає правильну довжину рядка? (Збільшення покажчика символів)
Це функція, яка рахує кількість символів у рядку: int str_len(const char* s) { int i = 0; while(*(s++)) { i++; } return i; } Чому це повертає правильну довжину? Скажімо, я називаю цю функцію простим рядком "a". Потім sзбільшується в циклі while, тому значення sі iобидва є 0.
12 c  while-loop  strlen  c89 

1
Навіщо визначати макрос до функції з тим самим іменем?
Я знайшов код нижче в https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v) { return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i); } #define arch_atomic_sub_and_test arch_atomic_sub_and_test що #defineнасправді робить? Коли це потрібно зробити?
12 c  linux-kernel 

3
Чи гарантує "непостійний" взагалі що-небудь в портативному коді С для багатоядерних систем?
Після дивлячись на купу з інших питань і їх відповідей , я отримую враження , що не існує ніякого широко поширеного угоди про те , що «летючий» ключове слово в C означає точно. Навіть сам стандарт не здається достатньо зрозумілим, щоб усі могли погодитися, що це означає . Серед інших …

4
Чи є фрагмент C, який ефективно розраховує безпечне доповнення без використання компілятора?
Ось функція C, яка додає intіншу, не вдається, якщо відбудеться переповнення: int safe_add(int *value, int delta) { if (*value >= 0) { if (delta > INT_MAX - *value) { return -1; } } else { if (delta < INT_MIN - *value) { return -1; } } *value += delta; return …

1
Реалізація кутових дужок GCC включає в себе. Чому це має бути таким, як описано нижче?
Цей документ у розділі 2.6 Computed Includes має такий параграф: Якщо рядок розширюється до потоку токенів, що починається з <лексеми і включає> маркер, то лексеми між <і першим> об'єднуються, щоб утворювати ім'я файлу, яке потрібно включити. Будь-який пробіл між маркерами зводиться до одного простору; то будь-який простір після початкового <зберігається, …
11 c++  c  gcc  language-lawyer 

2
Приклад коду IBM, функції, які не вводяться, не працюють у моїй системі
Я вивчав повторне працевлаштування в програмуванні. На цьому сайті IBM (справді хороший). Я створив код, скопійований нижче. Це перший код, який з'являється на веб-сайті. Код намагається показати проблеми, що стосуються спільного доступу до змінної в нелінійній розробці текстової програми (асинхронність), друкуючи два значення, які постійно змінюються в "небезпечному контексті". #include …
11 c  gcc  signals  x86-64  data-race 


1
Чому компілятори наполягають на використанні тут збереженого регістру?
Розглянемо цей код C: void foo(void); long bar(long x) { foo(); return x; } Коли я компілюю його на GCC 9.3 з будь-яким -O3або -Os, я отримую це: bar: push r12 mov r12, rdi call foo mov rax, r12 pop r12 ret Вихід з clang ідентичний за винятком вибору rbxзамість …
10 c  gcc  assembly  clang  x86-64 

3
Непослідовне усічення безпідписаних виразів цілих чисел бітфілдів між C ++ та C у різних компіляторах
Редагувати 2 : Я налагоджував дивну тестову помилку, коли функція, яка раніше знаходилась у вихідному файлі C ++, але перейшла у дослідний файл C, почала повертати неправильні результати. Приведений нижче MVE дозволяє відтворити проблему з GCC. Однак, коли я, за примхою, склав приклад з Кланг (а пізніше і з В. …

1
Чи гарантовано значення char, встановлене на CHAR_MAX, і воно гарантовано завершиться до CHAR_MIN?
Мій код: #include <stdio.h> #include <limits.h> int main() { char c = CHAR_MAX; c += 1; printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c); } Вихід: CHAR_MIN=-128 CHAR_MAX=127 c=-128 () Ми бачимо, що коли ми збільшуємо charнабір змінної CHAR_MAX, вона обертається на CHAR_MIN. Чи гарантована така поведінка? Або це буде …


1
C11 Atomic Acquire / Release та x86_64 відсутність завантаження / зберігання узгодженості?
Я бореться з розділом 5.1.2.4 стандарту C11, зокрема з семантикою випуску / придбання. Зауважу, що https://preshing.com/20120913/acquire-and-release-semantics/ (серед інших) зазначено, що: ... Семантика випуску запобігає переупорядкуванню пам'яті запису-релізу з будь-якою операцією читання або запису, яка передує їй у порядку програми. Отже, для наступного: typedef struct test_struct { _Atomic(bool) ready ; int …

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