Начинаю осваивать C, появляются вопросы...

Модератор: Модераторы разделов

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant писал(а):
29.08.2018 13:30
Здесь одно и тоже выражение вызова функции использовано дважды -- в выражении (expression) внутри if (...) и в expression statement.
Вы же видите разницу, да?
Вижу разницу. Более того, в книге, которую я упоминал выше, сказано, что
каждое утверждение (statement) завершается "точкой с запятой".
Ну, мысль там примерно такая: программа записывается как последовательность утверждений, они разделяются "точкой с запятой".
Иначе говоря, границы утверждений (statements) обозначаются "точкой с запятой". Очень простая и понятная мысль.
То есть можно было бы весь текст программы вытянуть в одну строку, а потом разделить её по "точкам с запятой" - получится эта самая "последовательность утверждений".
И все бы хорошо, но...
есть конструкции вроде таких

Код: Выделить всё

for (i=0;i<=10;i++)
{
......
......
}
которые вот эту простую и понятную мысль нарушают. И разделить текст программы по "точкам с запятой" уже нельзя.
И отделить statements друг от друга, стало быть, тоже нельзя.
Отсюда и неясно, что считать statement, а что нет.
А пример кода с обозначениями "statement/not a statement" ясности никак не добавляет, скорее наоборот.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Начинаю осваивать C, появляются вопросы...

Сообщение s.xbatob »

/dev/random писал:
29.08.2018 13:48
Точного определения термину statement нет. Только приблизительные.
Очень даже есть! В официальном стандарте ISO/IEC 9899 в секции 6.8 всё это подробно и однозначно описано.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
29.08.2018 14:00
Ну, мысль там примерно такая: программа записывается как последовательность утверждений, они разделяются "точкой с запятой".
Иначе говоря, границы утверждений (statements) обозначаются "точкой с запятой". Очень простая и понятная мысль.
Так в Паскалях, там ";" является разделителем. В Си немного иначе. Как уже было сказано выше, в разделе 6.8 стандарта всё прямо и недвусмысленно указано. Единственный statement без ";" -- это блок (он же compound statement) -- "{}", во всех остальных ";" является частью statement. Еще местами определения рекурсивны, но сути это не меняет.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5288
ОС: Gentoo

Re: Начинаю осваивать C, появляются вопросы...

Сообщение /dev/random »

s.xbatob писал:
29.08.2018 14:22
Очень даже есть! В официальном стандарте ISO/IEC 9899 в секции 6.8 всё это подробно и однозначно описано.
Там подробно и однозначно описано, что считать, а что не считать statement'ом в одном единственном языке. Но это понятие не зависит от языка.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

/dev/random писал:
29.08.2018 14:36
что считать, а что не считать statement'ом в одном единственном языке. Но это понятие не зависит от языка.
Вот сейчас непонятно было.
Что такое оператор (statement) по сути своей -- не зависит. Что считать в конкретном языке оператором -- полностью от языка и зависит, им и определяется. Синтаксис диктует.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5288
ОС: Gentoo

Re: Начинаю осваивать C, появляются вопросы...

Сообщение /dev/random »

bormant писал(а):
29.08.2018 14:54
Вот сейчас непонятно было.
Что такое оператор (statement) по сути своей -- не зависит. Что считать в конкретном языке оператором -- полностью от языка и зависит, им и определяется. Синтаксис диктует.
Если программист изучает совершенно новый язык по руководству, не использующему слова statement, он всё равно с лёгкостью ткнёт пальцем, где в нём statement, а где - нет. Если ваше определение не даёт человеку такой способности (заранее, ещё не зная, какой язык он будет изучать), то я не могу считать его "точным определением понятия statement".
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

s.xbatob писал:
29.08.2018 14:22
Очень даже есть! В официальном стандарте ISO/IEC 9899 в секции 6.8 всё это подробно и однозначно описано.
bormant писал(а):
29.08.2018 14:30
Как уже было сказано выше, в разделе 6.8 стандарта всё прямо и недвусмысленно указано.
Ткните меня носом в сей полезный документ.
Я смог найти только Committee Draft — May 6, 2005, но там примерно то же, что и здесь.
Самый спорный момент (о чем мы спорим) - expression statement - затронут только в смысле null и void значений плюс показано три примера кода. При этом об операторе присваивания не сказано ничего. О вызове функции - только частные случаи.
А между тем здесь пример кода содержит комментарии для случаев, которые не упомянуты в стандарте.
Так что у меня пока нет впечатления, что в стандарте всё "однозначно и недвусмысленно".
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Начинаю осваивать C, появляются вопросы...

Сообщение s.xbatob »

Hephaestus писал:
29.08.2018 16:29
Ткните меня носом в сей полезный документ.
Я смог найти только Committee Draft — May 6, 2005, но там примерно то же, что и здесь.
Самый спорный момент (о чем мы спорим) - expression statement - затронут только в смысле null и void значений плюс показано три примера кода. При этом об операторе присваивания не сказано ничего. О вызове функции - только частные случаи.
А между тем здесь пример кода содержит комментарии для случаев, которые не упомянуты в стандарте.
Так что у меня пока нет впечатления, что в стандарте всё "однозначно и недвусмысленно".
Документ к сожалению платный (и недешёвый), но можно найти drafts. Только мой посвежее, от 12 апреля 2011.

А присваивание, а так же вызов функции это вообще не операторы (statements), а выражения (expressions)! И об этом недвусмысленно сказано в стандарте:
6.8.3 Expression and null statements
Syntax
expression-statement:
expression(opt) ;
Semantics
The expression in an expression statement is evaluated as a void expression for its side
effects.
A null statement (consisting of just a semicolon) performs no operations.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
29.08.2018 16:29
Ткните меня носом в сей полезный документ.
Вот тут https://en.cppreference.com/w/c/links есть ссылки на актуальные черновики C99, C11, C17.
Ежели что, это раздел External Links подраздела C Reference с главной страницы.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant писал(а):
29.08.2018 18:10
Вот тут https://en.cppreference.com/w/c/links есть ссылки на актуальные черновики C99, C11, C17.
А, ну так я с этого ресурса и пришел. В моих постах выше ссылки и пример кода именно с этого сайта.
s.xbatob писал:
29.08.2018 17:50
А присваивание, а так же вызов функции это вообще не операторы (statements), а выражения (expressions)!
Если верить тому, что написано здесь, то expression - это тоже statement. Один из пяти вариантов. О чем я уже говорил выше.
Вызов функции есть expression.
Expression есть частный случай statement.
Следовательно, вызов функции есть частный случай statement.
И пример кода по ссылке содержит соответствующий комментарий.
Далее.
Вызов функции дает результат.
Вызов функции есть частный случай statement.
Следовательно, statement может иметь результат (разумеется, только в одном частном случае, когда statement есть вызов функции).
Вроде бы всё логично, но именно с этим спорят мои оппоненты.
Собственно, вокруг этого вопроса мы и ходим. По кругу.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение devilr »

Господа! ТС потеряли :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

Hephaestus писал:
29.08.2018 23:01
Вызов функции дает результат.
Вызов функции есть частный случай statement.
Следовательно, statement может иметь результат (разумеется, только в одном частном случае, когда statement есть вызов функции).
Вы так долго обсуждаете эту бесполезную ерунду, что даже я уже понял, о чём речь. А посему у меня к Вам просьба: продемонстрируйте пример кода, в котором использовался бы результат этого самого statement'а. Безо всяких там разглагольствований о том, что чей частный случай.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5288
ОС: Gentoo

Re: Начинаю осваивать C, появляются вопросы...

Сообщение /dev/random »

Hephaestus писал:
29.08.2018 23:01
Если верить тому, что написано здесь, то expression - это тоже statement. Один из пяти вариантов. О чем я уже говорил выше.
Expression statement (а не expression) - это тоже statement. Statement, состоящий из одного-единственного expression, и больше ни из чего, но сам этим expression не являющийся. Такой оператор является командой: "вычисли это выражение и отбрось результат". В некоторых языках для этого используется специальное ключевое слово. В C - нет, в нём достаточно записать само выражение. Но тем не менее, не следует путать оператор-выражение и выражение, из которого он состоит.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

devilr писал(а):
29.08.2018 23:06
Господа! ТС потеряли
Она сказала, что дальше обсуждать эти вопрсоы не планирует.
Вероятно,что-то для себя выяснила из наших обсуждений.
Может и заглянет ещё.
Bizdelnick писал:
29.08.2018 23:09
Вы так долго обсуждаете эту бесполезную ерунду, что даже я уже понял, о чём речь.
Ну, хорошо, если поняли. А почему "даже я уже понял"? Вы полагаете, что до Вас доходит дольше, чем до других?

А по поводу бесполезной ерунды... Может она и бесполезная, ну так на то он и форум, чтобы обсуждать всякое...
Я вот озвучил своё понимание всех этих statements - видите, кого-то зацепило, Есть ли в этом смысл? Да я не знаю.
Глядишь, в процессе обсуждений что-то станет яснее, просветление наступит, так сказать...
Bizdelnick писал:
29.08.2018 23:09
А посему у меня к Вам просьба: продемонстрируйте пример кода, в котором использовался бы результат этого самого statement'а.
Если всё-таки считать, что вызов функции есть expression, expression есть statement, а значит, результат expression есть результат statement,
то пример в общем-то, любой, где используется результат функции.

Ну, скажем, я приводил выше

Код: Выделить всё

if (mySuperFunction(a,b))
printf("OK");
но здесь нет точки с запятой. Хорошо.

Можно записать как-нибудь так:

Код: Выделить всё

a=mySuperFunction(b); //получть результат expression statement
if (a) //использовать результат expression statement
printf("OK");
Или даже так

Код: Выделить всё

for (i=mySuperFunction(b);i<1000;i++)
...
...
конструкция дикая, так писать совершенно незачем, но с точки зрения синтаксиса вроде бы допустимо.


Мне, кстати, очень не нравятся такие конструкции.
Что-нибудь вроде

Код: Выделить всё

if (SameFunction(a,b)<>1)
.....
.....
но приходится иметь с ними дело.
В коде с использованием WinAPI полным-полно таких.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

Hephaestus писал:
30.08.2018 07:52
Можно записать как-нибудь так:

Код: Выделить всё

a=mySuperFunction(b); //получть результат expression statement
if (a) //использовать результат expression statement
printf("OK");
Не пойдёт. Вы сохраняете в a результат mySuperFunction(b), а не всего statement. В других примерах аналогично.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
QWERTYASDF
Сообщения: 989
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение QWERTYASDF »

Добрейший денек. Имею пока такой вопрос.

Программа спрашивает три числа: два - операнды, и третье - для выбора одной из четырех арифм. операций, дальше считает и выводит результат.

Код: Выделить всё

#include <stdio.h>
main ()
{

int i, ii;
int s;
scanf("%d %d %d", &i, &ii, &s);

switch (s)
				    {

					    case '1': printf("%d + %d = %d\n", i, ii, i + ii); break;
					    case '2': printf("%d - %d = %d\n", i, ii, i - ii); break;
					    case '3': printf("%d * %d = %d\n", i, ii, i * ii); break;
					    case '4': printf("%d / %d = %d\n", i, ii, i / ii); break;
					    default:  printf("wrong!\n");

				    }

}

Вроде как, если по учебникам, то значение переменной выбора в каждом "case" должно быть заключено в кавычки. Но в данном примере срабатывает только "default". Если одинарные кавычки убрать, то все будет работать. Почему?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

QWERTYASDF писала:
30.08.2018 13:09
Вроде как, если по учебникам, то значение переменной выбора в каждом "case" должно быть заключено в кавычки.
Вы не те примеры в учебнике смотрите. Одинарные кавычки означают символ, а не целое число, то есть '1' — это не 1, а 49 (ASCII-код символа '1'). То есть введённое число сравнивается с 49, 50, 51 и 52, после чего попадаете в default. Так что или используйте формат "%c" и тип char для s, или уберите одинарные кавычки.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
QWERTYASDF
Сообщения: 989
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение QWERTYASDF »

Благодарю :)

Еще вопрос.

Вот такой код работает:

Код: Выделить всё

/* 1. Спрашивает 2 числа
 * 2. Запрашивет вид операции
 * 3. Вычисляет и показывает результат
 * 4. Запрашивает выход
 * 5. Если выход=0, то продолжает, если 1, то завершается
 */

#include <stdio.h>
#include <stdlib.h>

int main()
{

	int i, ii, stp;
int s;

while(1) {
		printf ("\n input numbers A and B:\n");
		        scanf ("%d %d", &i, &ii);


			    printf ("select operation: \n 1 plus \n 2 minus \n 3 multiplication \n 4 divison \n");
 scanf("%d", &s);
				    switch(s)
				    {

					    case 1: printf("%d + %d = %d\n", i, ii, i + ii); break;
					    case 2: printf("%d - %d = %d\n", i, ii, i - ii); break;
					    case 3: printf("%d * %d = %d\n", i, ii, i * ii); break;
					    case 4: printf("%d / %d = %d\n", i, ii, i / ii); break;
					    default:  printf("wrong!\n");

				    }



				        printf("\n Do you want stop? 0 - to exit and anykey to continue\n");
					    scanf ( "%d", &stp);
					    if (stp == 0) break ;


	}

}

Однако, если для выбора операции использовать символы т.е.:

Код: Выделить всё

/* 1. Спрашивает 2 числа
 * 2. Запрашивет вид операции
 * 3. Вычисляет и показывает результат
 * 4. Запрашивает выход
 * 5. Если выход=0, то продолжает, если 1, то завершается
 */

#include <stdio.h>
#include <stdlib.h>

int main()
{

	int i, ii, stp;
char s;

while(1) {
		printf ("\n input numbers A and B:\n");
		        scanf ("%d %d", &i, &ii);


			    printf ("select operation: \n p plus \n m minus \n u multiplication \n d divison \n");
 scanf("%c", &s);
				    switch(s)
				    {

					    case 'p': printf("%d + %d = %d\n", i, ii, i + ii); break;
					    case 'm': printf("%d - %d = %d\n", i, ii, i - ii); break;
					    case 'u': printf("%d * %d = %d\n", i, ii, i * ii); break;
					    case 'd': printf("%d / %d = %d\n", i, ii, i / ii); break;
					    default:  printf("wrong!\n");

				    }



				        printf("\n Do you want stop? 0 - to exit and anykey to continue\n");
					    scanf ( "%d", &stp);
					    if (stp == 0) break ;


	}

}

то, результат будет:

Код: Выделить всё

$./a.out 

 input numbers A and B:
2 3
select operation: 
 p plus 
 m minus 
 u multiplication 
 d divison 
wrong!

 Do you want stop? 0 - to exit and anykey to continue
Как-будто запрос на ввод операции вообще не происходит, а в "switch" передается какая-то ерунда. В чем здесь дело?
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение devilr »

Код символа и сам символ - разные вещи. Допустим, символ '0' это код 0x30. Понятно, что это не одно и то же. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Код: Выделить всё

#include <stdio.h>

int main(void)
{
    int a, b;
    char op, *fmt = "%d %c %d = %d\n";
    do {
        printf("number operator number: ");
        scanf(" %d %c %d", &a, &op, &b);
        switch (op)
        {
        case '+': printf(fmt, a, op, b, a+b); break;
        case '-': printf(fmt, a, op, b, a-b); break;
        case '*': printf(fmt, a, op, b, a*b); break;
        case '/': printf(fmt, a, op, b, a/b); break;
        default:  printf("*** wrong! ***");
        }
        printf("0 to stop, other to continue: ");
        scanf(" %c", &op);
    } while ('0' != op);
    return 0;
}
У вас легко узнать, что читает scanf, добавьте после него строку: printf("s = %d", s); -- увидите в выводе код прочитанного символа. 32 -- пробел, 10 -- перевод строки.
Пробел перед кодом формата в scanf заставляет пропускать пробельные символы: scanf(" %c", &s);
Последний раз редактировалось bormant 30.08.2018 14:58, всего редактировалось 3 раза.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

bormant писал(а):
30.08.2018 14:43
printf("s = %d", s);
Не надо новичкам код с такими грубыми ошибками в пример приводить.

Код: Выделить всё

printf("s = %hhd", s);
или

Код: Выделить всё

printf("s = %d", (int)s);
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Bizdelnick писал:
30.08.2018 14:47
Не надо новичкам код с такими грубыми ошибками в пример приводить.
Здесь нет ошибки. (int)s не нужно, ибо это сделает компилятор (такой уж тип параметра у printf, не умеет он char читать).
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

bormant писал(а):
30.08.2018 14:58
Здесь нет ошибки. (int)s не нужно, ибо это сделает компилятор (такой уж тип параметра у printf, не умеет он char читать).
В данном конкретном случае — да, но не стоит приучать новичка игнорировать ширину типа данных в строке формата.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

QWERTYASDF, кстати, на всякий случай: scanf() — весьма проблемная функция, и кроме как в примерах из учебников практически нигде не используется.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Bizdelnick писал:
30.08.2018 15:03
не стоит приучать новичка игнорировать ширину типа данных в строке формата
О каком игнорировании речь? Работает автоматическое преобразование char в int (ага, ровно также, как и массив в указатель). printf получает int, а не char. Модификаторы меньшей ширины нужны только если мы хотим вывести часть такого int-а.

Похоже, что всё совсем не так как кажется, да? ;-)
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение devilr »

Лучше явно указывать тип данных, чем надеяться на компилятор. Особенно в С.
Ну и не пользоваться переусложненными функциями, типа scanf. Более простой код содержит меньше скрытых ошибок.
Имхо.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
QWERTYASDF
Сообщения: 989
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение QWERTYASDF »

bormant писал(а):
30.08.2018 14:43

Код: Выделить всё

#include <stdio.h>

int main(void)
{
    int a, b;
    char op, *fmt = "%d %c %d = %d\n";
    do {
        printf("number operator number: ");
        scanf(" %d %c %d", &a, &op, &b);
        switch (op)
        {
        case '+': printf(fmt, a, op, b, a+b); break;
        case '-': printf(fmt, a, op, b, a-b); break;
        case '*': printf(fmt, a, op, b, a*b); break;
        case '/': printf(fmt, a, op, b, a/b); break;
        default:  printf("*** wrong! ***");
        }
        printf("0 to stop, other to continue: ");
        scanf(" %c", &op);
    } while ('0' != op);
    return 0;
}
У вас легко узнать, что читает scanf, добавьте после него строку: printf("s = %d", s); -- увидите в выводе код прочитанного символа. 32 -- пробел, 10 -- перевод строки.
Пробел перед кодом формата в scanf заставляет пропускать пробельные символы: scanf(" %c", &s);
Спасибо большое за улучшенный вариант и за указание на ошибку! Однако не понятно, откуда (в моем примере) берется символ перевода строки в переменной s. Если, например, верхнюю строчку с printf убрать, то результат такой-же - что-то выбрать не предлагается. Т.е. каким-то образом, насколько понимаю, в процессе запроса значения для s, вводится перевод строки? Но откуда и как?...
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение devilr »

Enter - это тоже символ. Как раз "перевод строки".
Кстати, если вы только начинаете учиться - лучше привыкать правильно инициализировать переменные. Т.е. не просто объявлять переменную "int a;", а еще и присваивать ей значение. Т.е. "int a=0;"
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

bormant писал(а):
30.08.2018 15:31
Работает автоматическое преобразование char в int (ага, ровно также, как и массив в указатель).
Вы взорвали мой мозг. Какое преобразование массива в указатель, если «массив» в C и есть указатель? И Вы что, хотите сказать, что char преобразуется в int всегда и везде, даже на 8-битной архитектуре с 16-битным int?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
QWERTYASDF
Сообщения: 989
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение QWERTYASDF »

devilr писал(а):
30.08.2018 15:48
Enter - это тоже символ. Как раз "перевод строки".
Я в курсе. Но может лучше ответите на мой вопрос?
Спасибо сказали:
Ответить