2016-12-17 14 views
0

저는 x86, x64 및 ARM 용 어셈블러 명령어를 뱉어내는 표현 파서를 작성했습니다.GCC C++ 경고 : 괄호 제안

나는 그것을 테스트하기 위해 임의의 표현식을 생성하고 GCC로 컴파일 한 후 그 결과를 내 코드와 비교합니다.

이제 파서가 GCC와 유사한 경고를 생성하도록하고 싶습니다.

나는 GCC와 5.1.0

int a = 100 + 100 | 10; 

GCC 주위에 경고 제안 괄호를주는 것으로 나타났습니다 |

하지만

int b = 100 * 100 | 10; 

GCC는 경고를 제공하지 않습니다.

하지만 덧셈과 곱셈 모두 비트 OR보다 우선 순위가 높기 때문에 int b = expression에 대한 경고가 표시되지 않는 이유는 무엇입니까?

나는 매우 피곤해서 뭔가를 간과 할 수 있습니다.

+4

개인적으로 나는 무엇이 일어나고 있는지 분명히하기 위해 둘 다 괄호를 사용할 것입니다. –

+0

https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Weparentheses- 201 –

+0

개인적으로 나는 괄호를 사용하지 않을 것이며, 컴파일러가 중복 된 구문을 추가 할 것을 제안하는 것은 완전히 잘못된 것으로 간주 할 것입니다. – EJP

답변

1

궁극적 인 대답 만에서 올 수있는 경우라는 규칙이 구현 자,하지만 그 이유는 그 이유는 그 연산자의 다른 환경 설정을 가지고 다른 언어가 있기 때문에 그 다른 언어의 사용자가 표현을 잘못 해석 할 수 있습니다. 예를 들어 some Pascal dialects,&*과 동일한 우선 순위를 가지고 | 같은 우선 순위가 +이므로 +|과 t 사이의 괄호는 다른 해석을 가질 수 있습니다 (표준 파스칼에는 & 또는 |이 없지만 표준 파스칼에서 andor의 우선 순위는 동일한 규칙을 따릅니다). 나는 많은 언어가 C 연산자 우선 순위를 복사하는 것처럼, 다른 언어는 파스칼을 복사한다고 생각합니다.

2

이, * 우선 순위 5, Precedence의 문제이다 +은 6이며 하나에서 경고를하지만, 다른에서 당신이 컴파일러 불일치를 발견하지 않을 경우 | 그래서 12

입니다. 아니면 컴파일러는 이해되지 않는다 (priorityDifference (X, Y) < 7 디스플레이 parentesis 경고.

이후 버전에 대한 버그 리포트.

+1

나는 전혀 버그라고 생각하지 않습니다. 이 내용은 https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index- 괄호 안의 괄호 안에 들어 있습니다. -Wraphesis (-Wall에 포함) –

+0

@CaptainGiraffe, 예 그러나 여기의 구체적인 차이점에서 왜 사람들은'+'와 반대로'*'에 의해 더 많은 (또는 덜) 혼란을 가져야 하는가? – Surt

+1

아니요, 이것은 버그가 아닙니다! 우선 순위가 중요하기 때문입니다. 이것은 산술 연산자와 비트 연산자를 혼합합니다! 두 개의 int 또는 int 표현식의 결과에 비트 OR을 적용하는 것은 드문 일이 아닙니다. 비트 OR의 결과로 수학을하는 것은 정말 이상합니다. – geipel

0

celtschk하여 설명을 읽은 후, 나는 C의 몇 가지 표현 ++ 및 무료 파스칼

C++

a = 100 + 100 & 100; // = 64 
    a = (100 + 100) & 100; // = 64 

무료 파스칼

a := 100 + 100 and 100; // = 200 
    a := (100 + 100) and 100; // = 64 

무료 파스칼

a := (100 + 100) and 222; // = 200 
    a := 100 + 100 and 222; // = 168 
시도

// // 무료 파스칼 C++

a = 100 * 100 & 222; // = 16 

a := 100 * 100 and 222; // = 16 

은 그래서 언어를 번역하면 두통을 야기 ++ C에서와 같은 우선 순위 레벨을 가질 수 없습니다 다른 언어 비트 연산자를 보인다. 어쩌면 GCC에 의해 생성 된 경고 메시지는 좀 더 설명적인 것일 수 있습니다.