竹蔵のだいあり - stakezo’s diary

健忘録として。役に立つかな?という情報も

python ブール演算子 の 計算順序をC言語と比較

頭の整理!

 

論理演算は、項が成立した時、その先の式は実行されない。Cとpythonは一緒!

 

パターン1: false && func2()

C言語でこう書くと、func2 は実行されない。左の項がfalseで確定したら右の項を計算する必要ないよね。ということで実際にfunc2は実行されない。

 
int a=1;
int b=2;

int cnt=0;

bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void)   { printf("func3 : cnt=%d", cnt); }
void func4(void)   { printf("func4 : cnt=%d", cnt); }
 
int main(void) {
if (func1(a) && func2(b)) {
  func3();
}
else {
  func4();
}
}
 
 
>> func4 : cnt=1

 

pythonでこう書くと、func2は実行されない。C言語と一緒^^

 
a=1
b=2

cnt=0

def func1(a_):
  global cnt
  cnt += 1
  if a_==0:
      return True
  else:
      return False

def func2(b_):
  global cnt
  cnt += 10
  if b_==0:
      return True
  else:
      return False

def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)

if func1(a) and func2(b):
  func3()
else:
  func4()
 
 
>> func4 : cnt=1
 
パターン2: true || func2()
C言語でこう書くと、func2 は実行されない。左の項がtrueで確定したら右の項を計算する必要ないよね。ということで実際にfunc2は実行されない。
 
int a=0;
int b=2;

int cnt=0;

bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void)   { printf("func3 : cnt=%d", cnt); }
void func4(void)   { printf("func4 : cnt=%d", cnt); }
int main(void) {
  if (func1(a) || func2(b)) {
    func3();
  }
  else {
    func4();
  }
}
 
 
>> func3 : cnt=1
 
pythonでこう書くと、func2は実行されない。C言語と一緒^^
 
a=0
b=2

cnt=0

def func1(a_):
    global cnt
    cnt += 1
    if a_==0:
        return True
    else:
        return False

def func2(b_):
    global cnt
    cnt += 10
    if b_==0:
        return True
    else:
        return False

def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)

if func1(a) or func2(b):
    func3()
else:
    func4()

>> func3 : cnt=1
 
パターン3: true && func2()
C言語でこう書くと、func2は実行される。左の項がtrueでも、右の項がtrueかfalseで結果が変わるよね。ということでfunc2は実行される。
 
int a=0;
int b=2;

int cnt=0;

bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void)   { printf("func3 : cnt=%d", cnt); }
void func4(void)   { printf("func4 : cnt=%d", cnt); }
int main(void) {
  if (func1(a) && func2(b)) {
    func3();
  }
  else {
    func4();
  }
}

>> func4 : cnt=11


 
pythonでこう書くと、func2は実行される。C言語と一緒^^
 
a=0
b=2

cnt=0

def func1(a_):
    global cnt
    cnt += 1
    if a_==0:
        return True
    else:
        return False

def func2(b_):
    global cnt
    cnt += 10
    if b_==0:
        return True
    else:
        return False

def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)

if func1(a) and func2(b):
    func3()
else:
    func4()

>> func4 : cnt=11
 
パターン4: false || func2()
C言語でこうかくと、func2は実行される。左の項がfalseでも、右の項がtrueかfalseで結果が変わるよね。ということでfunc2は実行される。
 
int a=1;
int b=2;

int cnt=0;

bool func1(int a_) { cnt+= 1; if (a_==0) { return true; } else { return false; } }
bool func2(int b_) { cnt+=10; if (b_==0) { return true; } else { return false; } }
void func3(void)   { printf("func3 : cnt=%d", cnt); }
void func4(void)   { printf("func4 : cnt=%d", cnt); }
int main(void) {
  if (func1(a) || func2(b)) {
    func3();
  }
  else {
    func4();
  }
}

>> func4 : cnt=11
 
pythonでこう書くと、func2は実行される。C言語と一緒^^
 
a=1
b=2

cnt=0

def func1(a_):
    global cnt
    cnt += 1
    if a_==0:
        return True
    else:
        return False

def func2(b_):
    global cnt
    cnt += 10
    if b_==0:
        return True
    else:
        return False

def func3(): print('func3 : cnt=%d' % cnt)
def func4(): print('func4 : cnt=%d' % cnt)

if func1(a) or func2(b):
    func3()
else:
    func4()

>> func4 : cnt=11
 
 

可読性はもちろん欠いちゃダメだけど、「項が確定した時」という仕組みを利用して

 

 func1 に軽い処理 (例えば0.001秒)

 func2 に重い処理 (例えば5秒)

 

を書いておくと良いと思う。func2を先に持ってきてしまうと、毎回func2に5秒取られるような結果になってしまう。気をつけよう。逆を言うと、func2の位置に、時間が取られる処理を配置することで、演算時間を考慮したりできると思う。