--*p : 단항 연산자는 연산 결합 순서가 오른쪽부터 시작된다. 그러므로 *p가 먼저 해석 되고 -- 연산이 되므로 *p값이 1줄어든 4로 출력된다.
*p-- : 단항 연산자는 연산 결합 순서가 오른쪽부터 시작한다. 그러므로 p--가 먼저 해석 되기 때문에 p값 자체가 줄어든다.
연산자 우선순위 및 결합순서
컴퓨터언어는 개발자를 비롯한 컴퓨터 과학/공학자들의 요구에
따라 다양하게 진화되었다. 최대한 인간의 일반적인 사고를 바탕에 두고 문법과 체계를 만든 것이지만, 아무래도 언어 개발자들의
마인드가 포함되어 있어 일반에게는 약간 어렵기도 한 것 같다. 다음은 C++ 연산자 우선순위표이다. 이것을 잘 알아야, 복잡한
포인터와 구조체, 배열이 섞인 복잡해 보이는 식도 기계적으로 풀어낼 수 있다. 그러므로 다음은 반드시 암기 가능하면 이해할
사항이다.
간략본(http://www.winapi.co.kr/clec/cpp1/5-4-1.htm)
순위 |
연산자 |
결합순서 |
1 |
( ) [ ] -> . |
왼쪽 우선 |
2 |
! ~ ++ -- + -(부호) *(포인터) & sizeof 캐스트 |
오른쪽 우선 |
3 |
*(곱셈) / % |
왼쪽 우선 |
4 |
+ -(덧셈, 뺄셈) |
왼쪽 우선 |
5 |
<< >> |
왼쪽 우선 |
6 |
< <= > >= |
왼쪽 우선 |
7 |
== != |
왼쪽 우선 |
8 |
& |
왼쪽 우선 |
9 |
^ |
왼쪽 우선 |
10 |
| |
왼쪽 우선 |
11 |
&& |
왼쪽 우선 |
12 |
|| |
왼쪽 우선 |
13 |
? : |
오른쪽 우선 |
14 |
= 복합대입 |
오른쪽 우선 |
15 |
, |
왼쪽 우선 |
자바(http://www.tech-faq.com/lang/ko/java-operator-precedence.shtml)
자바 연산자 우선순위는 자바를 결정하는 방법을 평가 연산자를 사용하여 첫 번째합니다.
In this chart, operator precedence is displayed from highest precedence to lowest precedence. 이 차트, 연산자를 우선 순위가 높은 우선 순위가 낮은 우선순위를 표시합니다.
우선순위 | 연산자 | 기능 | 결합순서 |
---|---|---|---|
1 | [] |
Array index 어레이 색인 | Left to Right |
() |
Method call 메서드 호출 | ||
. |
Member access 회원에 액세스 | ||
2 | ++ |
Prefix or postfix increment 접두사 또는 postfix 증감 | Right to Left |
-- |
Prefix or postfix decrement 접두사 또는 postfix 감소 | ||
+ - |
Unary plus, minus 단항 플러스, 마이너스 | ||
~ |
Bitwise NOT 비트없는 | ||
! |
Boolean (logical) NOT 부울 (논리) | ||
(type) |
Type cast 유형 캐스트 | ||
new |
Object creation 개체를 창출 | ||
3 | * / % |
Multiplication, division, remainder 곱셈, 부서, 나머지 | Left to Right |
4 | + - |
Addition, subtraction 또한 뺄셈 | Left to Right |
+ |
String concatenation 문자열 연결 | ||
5 | << |
Signed bit shift left to right 서명 비트 교대 왼쪽에서 오른쪽으로 | Left to Right |
>> |
Signed bit shift right to left 서명 비트 교대 오른쪽에서 왼쪽으로 | ||
>>> |
Unsigned bit shift right to left 오른쪽에서 왼쪽으로 서명되지 않은 비트 교대 | ||
6 | < <= |
Less than, less than or equal to 미만, 이하 같음 | Left to Right |
> >= |
Greater than, greater than or equal to 보다 큼, 크거나 같음 | ||
instanceof |
Reference test 참조 테스트 | ||
7 | == |
Equal to 같음 | Left to Right |
!= |
Not equal to 같지 않음 | ||
8 | & |
Bitwise AND 비트 및 | Left to Right |
& & |
Boolean (logical) AND 부울 (논리)과 | ||
9 | ^ |
Bitwise XOR 비트 xor | Left to Right |
^ |
Boolean (logical) XOR 부울 (논리) xor | ||
10 | | |
Bitwise OR 비트 또는 | Left to Right |
| |
Boolean (logical) OR 부울 (논리) 또는 | ||
11 | && |
Boolean (logical) AND 부울 (논리)과 | Left to Right |
12 | || |
Boolean (logical) OR 부울 (논리) 또는 | Left to Right |
13 | ? : |
Conditional 조건부 | Right to Left |
14 | = |
Assignment 과제 | Right to Left |
*= /= += -= %= <<= >>= >>>= &= ^= |= |
Combinated assignment 임무는 combinated (operation and assignment) (작업과 배정) |
Notes: 참고 사항 :
참고
- 이쪽 블로그를 보면 연산자 우선 순위에 대한 여러 생각들을 정리해 놓았다
출 처 : http://learder.tistory.com/827019
2. 같은 패키지 내의 클래스와
3. 그 클래스를 상속받는 클래스
모두에서 접근이 가능하다.
c++에서는 자기 자신의 클래스와 자식 클래스의 멤버 함수로부터의 접근만 허용한다.
void quick_sort(int *data, int left, int right)
{
int k;
int i, j, pivot;
i = left;
j = right;
pivot = left;
if(i >= j)
return;
while(i < j)
{
while(data[++i] < data[pivot])
{
if(i >= right)
break;
}
while(data[j] > data[pivot])
{
j--;
if(j <= left)
break;
}
if(i < j)
swap(data, i, j);
}
swap(data, pivot, j);
quick_sort(data, left, j - 1);
quick_sort(data, j + 1, right);
}
void swap(int *data, int i, int j)
{
int tmp;
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
// 버블 정렬
void bubble(int *arr, int size)
{
int i, j;
int tmp;
for(i = 0 ; i < size - 1 ; i++)
{
for(j = 0 ; j < size - i - 1 ; j++)
{
if(arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
import java.util.*;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int com, eng, math, java;
Scanner input = new Scanner(System.in);
System.out.print("점수 : ");
com = input.nextInt();
eng = input.nextInt();
math = input.nextInt();
java = input.nextInt();
int sum = com + eng + math + java;
double avg = (double)sum / 4;
System.out.println("총점 : " + sum);
System.out.println("평균 : " + avg);
}
}
import java.util.*;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.print("정수값 : ");
int num = input.nextInt();
System.out.println("제곱 : " + (num * num));
System.out.println("세제곱 : " + (num * num * num));
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int pay = 10000;
int price = 3500;
int extra = (int)(price * 0.1);
int cnt = 2;
int total = (price + extra) * 2;
System.out.println("지불한 돈 : " + pay);
System.out.println("까페 모카 단가 : " + price);
System.out.println("수량 : " + cnt);
System.out.println("부가세 : " + extra);
System.out.println("상품 총액 : " + total);
System.out.println("거스름돈 : " + (pay - total));
}
}
import java.util.*;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.print("정수값 : ");
int num = input.nextInt();
System.out.println("천의 자리 : " + (num / 1000));
num %= 1000;
System.out.println("백의 자리 : " + (num / 100));
num %= 100;
System.out.println("십의 자리 : " + (num / 10));
num %= 10;
System.out.println("일의 자리 : " + num);
}
}
import java.util.*;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.print("시간(초) : ");
int sec = input.nextInt();
int total = sec;
int hour = sec / 3600;
sec %= 3600;
int min = sec / 60;
sec %= 60;
System.out.println(total + "초는 " + hour + "시간 " + min + "분 " + sec + "초이다.");
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("\'A\'+1\t\'A\'+2\t\'A\'+3");
System.out.println("---------------------------------------");
System.out.println((char)('A'+1) + "\t" + (char)('A'+2) + "\t" + (char)('A'+3));
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double r = 5.0;
double v = 3.14 * r * r;
System.out.println("반지름 : " + r);
System.out.println("부피 : " + v);
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double cm = 162.56;
double inch = cm / 2.54;
double pit = inch / 12;
inch %= 12;
System.out.println(cm + "cm는 " + (int)pit + "피트 " + (int)inch + "인치이다.");
}
}
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
double pit = 5;
double inch = 4;
double tinch = pit * 12 + 4;
double cm = tinch * 2.54;
System.out.println((int)pit + "피트 " + (int)inch + "인치는 "+ cm +"cm");
}
}
void intToChar(char *buf, int num)
{
int i, j;
int target; // 각 자리수
int value = 1; // 숫자 크기 확인
while(value <= num)
{
value *= 10;
}
for(i = 0, j = value/10 ; j >= 10 ; j /= 10)
{
target = num / j;
num = num % j;
buf[i++] = target + 48; // buf에 문자값 저장
}
buf[i++] = num + 48;
buf[i] = '\0';
}
int atoi(char *c) // Charter to Integer
{
int result = 0;
int val = 1;
int i;
char *tmp = c;
while(*tmp != '\0')
{
val *= 10;
tmp++;
}
tmp = c;
for(i = (val / 10) ; 1 <= i ; i /= 10)
{
result += ((*tmp - 48) * i);
tmp++;
}
return result;
}