最近轉為學習c++,進行了一些c++的項目開發,熟悉了js語言特性的我,一時間編程遇到很大困難,其中很困惑的就是條件判斷的問題,這裡以c++、js進行比較說明。首先看幾個測試。
測試一、c++源碼:
[cpp]
int test(){
printf("test\n");
return 1;
}
int main()
{
int i=0;
if(i&test())
printf("ok1");
else
printf("ok2");
}
運行結果:
[cpp] view plaincopy
test
ok2
測試二、js源碼:
[javascript]
function test(){
console.log("test");
return 1;
}
var i=0;
if(i&&test())
console.log("ok1");
else
console.log("ok2");
運行結果:
[javascript]
ok2
從原理上說,雖然i=0對於if條件來說,不管test函數返回的結果如何,與運算後都為0(假),結果應該是"ok2”,而兩種語言在這上面的運行機制完全不一樣,顯然c++做了很多無用功。下面再看看或運算如何。
測試三、c++源碼:
[cpp]
int test(){
printf("test\n");
return 0;
}
int main()
{
int i=1;
if(i||test())
printf("ok1");
else
printf("ok2");
}
運行結果:
[cpp]
ok1
測試四、js源碼:
[javascript]
function test(){
console.log("test");
return 0;
}
var i=1;
if(i||test())
console.log("ok1");
else
console.log("ok2");
運行結果:
[javascript]
ok1
在或運算上,c++和js語言判斷機制相同,當第一個條件為真時,不再判斷並列條件test函數的結果。
個人是比較困惑,於是再對c#進行測試。
測試五、c#源碼:
[csharp]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string con = "";
bool test()
{
con += "test";
return true;
}
private void button1_Click(object sender, EventArgs e)
{
con = "";
bool i = false;
if (i&&test())
con += "ok1";
else
con += "ok2";
MessageBox.Show(con);
}
}
}
運行結果:
說明c#與js機制相同。
至於為什麼要這樣比較,是因為假如有兩個條件A、B,A和B都成立時做一件事,其中A不成立B就一定不成立,那麼用js,語句就可以這樣寫:
[javascript]
if(A&&B){
}else{
}
當A不成立時,自然不再判斷B,這樣運行效率沒有影響,但如果用c++來寫,兩個條件都會判斷,效率就有影響了,所以得這樣寫:
[cpp]
if(A){
if(B){
}
}else{
}
這裡記下開發中遇到的困惑,至於這兩種語言的深層次問題筆者也說不清楚,做個總結先。