Short-Circuit Evaluation 은 &&이나 || 에서 첫번째 argument 에서 조건의 결과값에서 이미 전체 결과값이 판단되었을 경우 첫번째로만 수행하는 것을 말한다.


예를 들어,

BOOL condition1(int pValue)
{
    printf("condition1() has been executed\n");
    return 0 == pValue;
}

BOOL condition2(int pValue)
{
    printf("condition2() has been executed\n");
    return 0 == pValue;
}

int main()
{
    int count1 = 1;
    int count2 = 0;

    if (condition1(count1) && condition2(count2))
    {
        printf("&& test\n");
    }

    count1 = 0;
    if (condition1(count1) || condition2(count2))
    {
        printf("|| test\n");
    }
}

첫번째 && 연산에서는 condition1 이 false 이므로 condition2() 까지는 수행 시키지 않는다.

두번째 || 연산에서는 condition1 이 true 이므로 condition2() 까지는 수행 시키지 않는다.


여기까지만 보면 그렇구나 싶긴 한데 골치 아픈건 다음의 경우이다.

static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
{
...
    while (slabp->inuse < cachep->num && batchcount--) {
        STATS_INC_ALLOCED(cachep);
        STATS_INC_ACTIVE(cachep);
        STATS_SET_HIGH(cachep);

        ac->entry[ac->avail++] = slab_get_obj(cachep, slabp,
				    node);
    }
    check_slabp(cachep, slabp);
....
}

linux-2.6.24의 커널 코드 중 일부이다.

저기 while 문 안의 경우를 보면 && 연산자는 충분히 Short-Circuit Evaluation 를 할 수 있으며 따라서 2번째 조건인 batchcount--를 수행하지 않을 수도 있다.

물론 리눅스 커널 코드야 저런경우까지 고려해서 작성되었겠지만 Short-Circuit Evaluation을 모르고 막쓰다가 2번째 조건에 뭔가 연산을 일으키지 못한다면 흐름을 이해하지 못하게 될 것이다.


정 헷갈리면 나이브하게 다 풀어서 해야 한다.


Posted by 없다캐라
기존에는 간단히 file로 남겨둘 때 c 의 function을 사용하곤 했는데 
c++ type의 file i/o 용 stream을 쓰기로 했다.

ofstream / ifstream 

이녀석의 2byte unicode type을 사용하기 위해서는 앞에다가 w를 붙이면 된다.

1. output
wofstream f( L"c:\\mod.txt", std::ios::out | std::ios::app );

f << *it << endl;

f.close();


2. input
wifstream f( _T("c:\\mod.txt"), std::ios::app );

f >> L"TEST";

f.close();


심플하군하~
Posted by 없다캐라

예전에 네이버 블로그에 썼던 글인데 이리루 옮겨 왔다.


#define DELETE                           (0x00010000L)

struct perm_name
{
    DWORD perm;
    const char * name;
};

#define PERM_NAME(perm) {perm, #perm}

perm_name process_perm_names[] =
{
    { DELETE, #DELETE },     // 이건 안됨. 전처리기에서 #이 의미를 가지는 것 같음.
    PERM_NAME(DELETE),      // 잘 됨
};

 

define된 것을 풀어서 { DELETE, #DELETE } 이 안되더라.


Posted by 없다캐라
이전버튼 1 이전버튼

블로그 이미지
없다캐라

태그목록

공지사항

Yesterday26
Today6
Total189,888

달력

 « |  » 2018.12
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

글 보관함