2017-01-12 11 views
1

Prog 1:программирования C - оператор запятой в пределах во время цикла

#include<stdio.h> 
int main() 
{ 
    int i=0; 
    while(i<=8,i++); 
    printf("%d",i); 
    return 0; 
    } 

Prog 2:

#include<stdio.h> 
int main() 
{ 
    int i=0; 
    while(i++,i<=8); 
    printf("%d",i); 
    return 0; 
} 

Выход Prog 1 1 и что из Prog 2 равно 9.

Может кто-то объяснить, что происходит здесь. Как два разных кода?

ответ

2

Оператор запятой оценивает оба аргумента в свою очередь, отбрасывая результат, за исключением последнего. Последнее оцениваемое выражение определяет результат всего выражения.

i<=8,i++ - здесь значение выражения представляет собой значение i++, которое является значением i перед тем, как быть увеличенным. Это 0, поэтому цикл немедленно прекращается.

i++,i<=8 - здесь значение выражения является значение i<=8, которое равно 0 только тогда, когда i увеличивается до 9.

На личной ноте: Я думаю, что вторая форма, в то время как несколько сравнимо с для цикла , менее понятен читателю кода, чем фактический цикл.

0

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

Prog 1: рассмотреть i <= 8, i++. i <= 8 оценивается и отбрасывается, тогда оценивается i++. Все выражение имеет неосвещенное значение i. Начиная с i изначально 0, цикл while заканчивается на первой итерации. Выход будет, что по отдельности увеличивается значение i, т.е. 1.

Prog 2: i++ вычисляются и результат отбрасывается, а затем i <= 8 оцениваются с новой стоимостью, так как i, является точкой секвенирования. Таким образом, цикл while продолжается до i <= 8 уже не true с приращенным значением i. Выход будет 9.

0
while (condition) 
    statement 

Заявление выполняется повторно. Прежде чем оценивать каждое условие выполнения (итерации). Если это ложь, то цикл заканчивается и выполнение продолжается за его пределами.

В этом случае инструкция пуста. Оператором может быть либо одна строка кода, заканчивающаяся точкой с запятой (;), либо код блока od, заключенный в фигурные скобки ({,})

Таким образом, мы получаем условие, которое оценивается непрерывно, пока оно не даст false. Чтобы понять, что происходит, нам нужно изучить способ работы с запятой.

(Обратите внимание, что запятая в качестве символа может использоваться в местах C - я могу думать о объявлениях функций, определениях и вызовах - в этом случае запятый символ является частью условия, поэтому он действует как оператор.)

expression1 , expression2 

Оператор-оператор вызывает выражение, которое сначала оценивается, а затем выражение2, и возвращает значение выражения2.

При каждой оценке условия мы будем оценивать оба операнда (i ++, i < = 8) и продолжать, пока правый операнд будет считаться истинным.

Хотя обычно мы используем условие для контроля выполнения цикла, часто, так как в этом случае условие может иметь другие эффекты. В нашем случае на переменную i влияет каждая оценка состояния. Он увеличивается на единицу.

Наш пример отличается только порядком операндов условия, поэтому в результате чего результат операндов действительно контролирует выполнение цикла.

Рассмотрим сначала второй пример. В этом случае мы имеем условие «i ++, i < = 8». Это означает, что при каждой оценке мы сначала увеличиваем i, затем проверяем, меньше или равно 8. Итак, при первой оценке условия мы увеличим i от 0 до 1 и сделаем вывод, что 1 < = 8, поэтому цикл продолжается. Построенная таким образом петля может разрушаться только тогда, когда я становится 9, т. Е. на 9-й итерации.

Теперь, как для первого примера, условие «i < = 8, ++ i». Поскольку сравнение не имеет побочных эффектов, мы можем выполнить любое количество сравнений в любом порядке, и если это единственное, что мы сделали, то есть, если мы не выполнили никаких других действий способом или порядком, зависящим от результатов сравнений, эти сравнения ничего не сделают. Как и в нашем случае, мы оцениваем значение i < = 8, которое оценивает значение true или false, но мы не используем значение, просто переходим к оценке правильного операнда. Поэтому наше условие практически равно «i ++».

Это унарный оператор пост-инкременции. Он возвращает значение i и только затем увеличивает его на единицу. (Все, что гарантировано, - это порядок. Когда я точно увеличиваюсь, на самом деле сложно и не всегда определяется в стандартном вопросе, если я не ошибаюсь). Итак, что происходит, мы сначала проверяем, является ли я истинным или ложным, а затем, несмотря ни на что, мы увеличиваем его на единицу и только потом прерываем цикл или продолжаем.

В C нет истинного или ложного значения, нет булевского типа. Целые числа считаются истинными, если они имеют ненулевое значение.

Итак, при первой оценке «i ++» получаем 0, это ложь. Это означает, что цикл прерывается без какой-либо одной итерации. Однако оценка «i ++» заставляет ее увеличиваться на одну, тем не менее, поэтому, когда мы закончили цикл while, i уже равен 1.