f0
및 f1
을 동일한 바이트에 포함하는 구현의 경우 아래 정의 된 프로그램이 있습니까?비트 필드 및 시퀀스 포인트
struct S0 {
unsigned f0:4;
signed f1:4;
} l_62;
int main (void) {
(l_62.f0 = 0) + (l_62.f1 = 0);
return 0;
}
나는 거기에 다른 생각을 할만한 이유가 있다면 C99와 C11에 대한 답에 흥미가 있습니다. 2 : 객체가 표현의 평가에 의해 최대 한번의 저장된 값 수정 된 Fi를 에드를 가진다 이전 및 다음 시퀀스 지점 사이
C99에서
은, 내가 찾은 모두 6.5이었다. [...]
이 단락이 위의 프로그램에 어떤 영향을 미치는지 분명하지 않습니다.
많은 수의 무작위 테스트를 기반으로 대부분의 컴파일러는 두 지정이 간섭하지 않는 코드를 생성하는 것으로 나타납니다.
표준의 해당 부분은 나에게 두통을줍니다. 내 현재의 읽기 의도는 UB이다 (예를 들어 C11에서는 두 개의 스레드에서 두 개의 필드를 수정하는 과정이 동기화되지 않음), 6.5의 언어는 다른 것과 마찬가지로 비트 필드를 언급하는 것을 잊어 버린다. 비트 필드가 특별한 처리를하는 곳. – AProgrammer
@AProgrammer : 위 코드는 명확한 논리적 의미를 지니 며 (쓰기가 순차적으로 발생하는 것처럼 처리합니다), 작성자가 둔기가 아닌 컴파일러가 해당 동작을 생성하는 코드를 생성해서는 안됩니다 단일 스레드의 경우. 표준 작성자가 UB가되도록 의도 한 그럴듯한 이유를 제안 할 수 있습니까? – supercat