Путаница в программе C - PullRequest
       17

Путаница в программе C

0 голосов
/ 24 сентября 2010

Хорошо ли задана данная программа?

#include <stdio.h>
int main()
{
    int a=2,*f1,*f2;
    f1=f2=&a;
    *f2+=*f2+=a+=2.5;
    *f1+=*f1+=a+=2.5;
    printf("\n%d %d %d\n",a,*f1,*f2);
    return 0;
}

Ответы [ 2 ]

8 голосов
/ 24 сентября 2010

Нет.Бит с *f2 += *f2 += ... - это уже неопределенное поведение.Несколько модификаций одного и того же объекта без промежуточной точки последовательности.Не нужно смотреть дальше.

0 голосов
/ 24 сентября 2010

edit - Я был совершенно неправ, когда сказал, что в скобках указан порядок операций. AndreyT был прав, чтобы исправить меня. Исходный код, который я разместил, также имел неопределенное поведение. Это моя вторая попытка. Мой оригинальный пост также ниже этого, так что исправления можно увидеть.

Хорошей практикой кодирования является разбиение объявлений переменных на несколько строк, чтобы вы могли видеть, что происходит.

// Этот код является экспериментом с указателями

#include<stdio.h>

int main()
{
int a=2;                       //initialize a to 2
int *f1; 
int *f2;

f1 = &a;                       //f1 points to a
f2 = &a;                       //f2 points to a

a += 2.5;                      
*f1 += a;             
*f1 += a;
*f2 += a;
*f2 += a;    

printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}

результат распечатки 64 64 64

// Мой предыдущий неверный код указан ниже:

# включают

int main()
{
int a=2;                       //initialize a to 2
int *f1; 
int *f2;

f1 = &a;                       //f1 points to a
f2 = &a;                       //f2 points to a

a += 2.5;                      //2.5 + 2 = 4.5, but 4.5 as an int is 4.
*f1 += (*f1 += a);             //4 + 4 = 8. 8 + 8 = 16.
*f2 += (*f2 += a);             //16 + 16 = 32. 32 + 32 = 64.                             

printf("\n%d %d %d\n",a,*f1,*f2);
return 0;
}

результат распечатки 64 64 64

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

...