Невозможно интерпретировать управляющий оператор в linux - PullRequest
1 голос
/ 26 мая 2020

У меня есть следующая программа C, сохраненная в файле с именем 1. c

#include<stdio.h> 
void main() 
{ 
printf("Hello World");
}

После компиляции я пытаюсь выполнить ее, используя

./a.out || echo Hi

I ожидаю увидеть следующий вывод

Hello World

Но результат, который я получаю, будет

Hello WorldHi

Приведенный выше вывод кажется неправильным, поскольку echo hi должен выполняться, только если ./a.out выполняет не выполняется успешно. Где я ошибаюсь в интерпретации вывода?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

void main() вызывает неопределенное поведение вашей программы. Начиная со стандарта C11 5.1.2.2.1p1 правильная подпись main:

  • int main(void) { /* ... */ }
  • int main(int argc, char *argv[]) { /* .. */ }
  • любая эквивалентно двум приведенным выше
  • или некоторому определенному реализацией main.

Ваш компилятор не имеет каких-либо определенных реализацией main и void main() не эквивалентно каким-либо другим формам.

Таким образом, неопределенное поведение вашей программы проявляется в том, что ваша программа завершает работу с ненулевым статусом выхода, что приводит к тому, что оболочка выполняет правую часть ||. Измените возвращаемое значение main на int.

2 голосов
/ 26 мая 2020

Ваше приложение должно возвращать значение:

#include <stdio.h> 

int main(void) 
{ 
    printf("Hello World\n");
    return 0;
}

Всегда компилируйте свой код с помощью -Wall -Wextra -Werror, это остановит компиляцию исходного кода, поскольку void main() не является допустимым точка входа .

...