ऐसा नहीं है कि देखने के लिए आसान है:कई मॉड्यूलस संचालन पर तार्किक संचालन अनुकूलित?
(i % 3 == 0) && (i % 5 == 0)
को सरल किया जा सकता है:
(i % 15 == 0)
फिर भी जीसीसी के उत्पादन में देख, यह इस यहां तक कि उच्च अनुकूलन के स्तर पर नहीं किया जाता है लगता है।
क्या कोई भी कंपाइलर इस तरह के अनुकूलन करता है, या क्या कोई अच्छा कारण है कि ये दो परीक्षण अर्थात् समकक्ष नहीं हैं?
संपादित करें: जो लोग कहते हैं कि यह एक किनारा मामला है, निम्नलिखित एक समान मामला है के जवाब में:
(i < 3) && (i < 5)
कोई भी संख्या कम से कम 3, हमेशा होना चाहिए कम से कम 5. दूसरे टेस्ट अनावश्यक है।
मैं भी जवाब के जवाब में निम्नलिखित जोड़ने के लिए है कि संकलक अगर वातावरण प्रभावित होता है पता नहीं कर सकते हैं ... इस कोड को देखो करना चाहते हैं:
करने के लिए "repz सेवानिवृत्तvoid foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
पूरे समारोह कम हो जाता है "जीसीसी द्वारा -O2
के साथ। मैं जो भी बात कर रहा हूं उससे कहीं अधिक जटिल है।
मेरा अनुमान है कि शॉर्ट-सर्किट मूल्यांकन की गारंटी है ... – Anycorn
अनुकूलन के लिए समान चर पर एकाधिक तुलनाओं के लिए सामान्य जांच में संकलक करें? यह एक फ्रिंज केस की तरह दिखता है ... – trutheality
@ एनीकॉर्न, क्या आप कह रहे हैं कि 'i' का मूल्यांकन करने से दुष्प्रभाव हो सकते हैं, और संकलक यह नहीं करता है कि यह करता है या नहीं? – ikegami