printf("something\n"), без точки с запятой -- это expression, а именно вызов функции) и "statement" (например if (expression) statement -- это statement), а иногда expression может быть statement'ом (например, printf("something\n");, с точкой с запятой), это называется "expression statement".
Как называть по-человечески строчки:if ( a > b ) printf("something\n");
if с единственной инструкцией-выражением.А такое:if(condition) { printf("something1\n"); printf("something2\n"); }
if с составной инструкцией содержащей две инструкции-выражения. float b; ... if (b == b)
Two values (other
than NaNs) with the same object representation compare equal, but values that compare
equal may have different object representations.. Как это усовершенствовать?
An optional 'm' character. This is used with string conversions (%s, %c, %[), and relieves the caller of the need to allocate a corresponding buffer to hold the input: instead, scanf() allocates a buffer of sufficient size, and assigns the address of this buffer to the corresponding pointer argument, which should be a pointer to a char * variable (this variable does not need to be initialized before the call). The caller should subsequently free(3) this buffer when it is no longer required.
#include <stdio.h>
int main()
{
char *chars;
scanf("%m[^\n]",&chars);
printf("%s\n", chars);
} Что происходит в данном случае
int ** ptr = &arr;
initialization from incompatible pointer type.Получается что далее ptr == arr == &arr
== использованное в смысле "численно равно" действительно имеет место. Но типы этих трёх значений разные: int **/int[4]/int (*)[4]Почему нельзя получить указатель на указатель на массив в данном случае?
#include <stdio.h>
int main(void)
{
int arr[4] = {1, 2, 3, 4};
int *pa = arr;
int ** ptr = &pa;
printf("%d", **ptr); // 1
return 0;
} Почему если считывать число как long double, то результат получается нормальным,
input 2 => output 8.000000 (%lf)
%lf -- это не long double, а просто double. %f -- это float, а long double -- это %Lf. См. man scanf.Почитал, что ядро Linux использует стандарт C90,
хотелось бы писать на K&R C
Какой стандарт наиболее поддерживаемый сейчас и распространён среди программистов под настольные ОС
при компиляции файла copy.c вылетают ошибки
In function `main':
copy.c:(.text+0x67): undefined reference to `usageErr'
copy.c:(.text+0xb6): undefined reference to `errExit'
copy.c:(.text+0x122): undefined reference to `errExit'
gcc copy.c error_functions.c -o copy Почему в С допускают такое?
If an attempt is made to modify an object defined with a const-qualified type through use
of an lvalue with non-const-qualified type, the behavior is undefined.const char *, а возвращает char *? Чтобы показать, что сама она свой аргумент не изменяет, но чтобы не заставлять всех её пользователей делать приведение типа у результата. Я бы сказал, что проблема в этой функции, но она настолько старая, что никто не будет чинить её прототип.char *strchr(char *, char) и const char *strchr(const char *, char), но в С нет перегрузки функций. arr это же просто указатель.Почему нельзя сменить его значение что бы он указывал на новый адрес
void f(int arr[])
{
arr = arr + 1;
}И почему нельзя создавать массивы (не символьные) в стиле указателей?int * arr = {1, 2, 3, 4, 5}; // ne ok
int * arr = (int []){1, 2, 3, 4, 5}; // ok Объясните почему именно так, с умножение переполняется, а при сложении как будто просто отсекаются лишние биты.
char num1[N]; char num2[N]; char num3[N]; char *nums[3] = {num1,num2,num3};
nums[3][N]?while(c=fgetc(in))if ( c == '\n' || c == ' ' )if ( c == '\n' || c == ' ' || c == EOF)(*(nums+i))[j]nums[i][j]?int length(char s[]){strnlen из string.hОткуда диапазон значений, тоже понятно. Но что конкретно происходит при попытке выйти за этот диапазон?
Почему при вычислении степеней двойки в какой-то момент выводится минимальное значение, -32768, а затем - одни нули?
Что происходит при других операциях со слишком большими числами?
Проект создаёт статическую библиотеку mylib, но в неё не включена требуемая реализация boost, то есть при линковке приложения с mylib нужно явно указывать, что нужно линковать boost.
pkg-config --libs <имя библиотеки>и получает список ключей для линковки.