float del (float a, float b)
{
float res;
...
res = ...;
....
return res;
}
....
float result = del (num1, num2);
что делает "return res" во втором куске кода? То есть в переменную res записывается деление числа А и Б. А потом оно куда-то там возвращается..
Подскажите как можно реализовать программно текстовый протокол SCPI?
Есть синонимы команд, есть не обязательные параметры, параметры могут быть, могут не быть, может быть сразу несколько. Как это всё обрабатывать и проверять не пытается ли пользовать ввести несуществующую команду?
for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);
for(; *pchar; ++length, ++pchar);
for(char* pnew_char = new_char; *pnew_char++ = *--pchar;);
В каком месте может быть ошибка?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
int fd0[2], fd1[2], n;
char c;
pipe(fd0);
pipe(fd1);
if (!fork()) {
close(fd0[0]);
close(fd1[1]);
write(fd0[1], "c", 1);
sleep(1);
if ((n = read(fd1[0], &c, 1)) != 1) {
printf("Дочерний процесс. Результат чтения: %d\n", n);
exit(0);
}
printf("Дочерний процесс прочитал: %c\n", c);
exit(0);
}
close(fd1[0]);
close(fd0[1]);
write(fd1[1], "p", 1);
if ((n = read(fd0[0], &c, 1)) != 1) {
printf("Родительский процесс. Результат чтения: %d\n", n);
exit(0);
}
printf("Родительский процесс прочитал: %c\n", c);
exit(0);
return 0;
}
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