Olarak bilgisayar biliminin , bir işlev tarafı olduğu söylenir etkisi (kelime-kelime İngilizce çeviri yan etkisi , anlam olan yakın bir olan bir yan etkisi de, yani örneğin, yerel ortamı dışında bir durumunu değiştirir gözlenebilir varsa) bir değer döndürmek dışında dış dünya ile etkileşim. Örneğin, statik bir yerel değişkeni , yerel olmayan bir değişkeni veya referansla iletilen değiştirilebilir bir bağımsız değişkeni değiştiren işlevler, G / Ç işlemlerini gerçekleştiren işlevler veya diğer yan etki işlevlerini çağıran işlevler. Genellikle bu etkiler, program davranışının okunabilirliğini karmaşıklaştırır ve / veya işlevlerin ve prosedürlerin yeniden kullanılabilirliğine müdahale eder. Haskell gibi bir dil, onları kasıtlı olarak monad adı verilen bileşenlerle sınırlar .
Daha yaygın olarak, tutarlı bir programın (şartnamelere uygun olarak alınan değerler ve durumlar) bir modifikasyonunun, kapsamın dikkate alınmaması nedeniyle beklenmeyen değerlere veya davranışlara yol açtığı durumlarda çoğu zaman bir yan etki ortaya çıkar. değişken tanım kümesi veya işlev sözleşmesi.
Zorunlu programlama programlarının operasyonda kenar etkilerinin kullanımına izin verir, hatta kasten (örneğin deyimini kullanır COMMONyılında FORTRAN izin vererek) derleyici (anahtar kelimeyi dikkate volatileiçinde C ).
Fortran dil belirtimi , bir işlevin çağrı parametrelerini değiştirmesini yasakladı ve çoğu derleyici bunu halletti.
Fonksiyonel programlama yerine minimize edilmesi ve genellikle yapılarda tek nedenini sağlanan bunun için izole: monads .
İşlemcilerin tasarımında, talimatlar işlemcinin iç durumunu açıkça bildirmeden değiştirebilir. Bu nedenle bir toplama talimatı, koşul değişkenlerini (taşıma, sıfır, taşma, vb.) Değiştirebilir veya değiştirmeyebilir. İşlemcinin bir talimat ardışık düzeni varsa, bu bir tasarım problemi oluşturur. Bu nedenle, IBM'in aynı anda çalışan dört aritmetik ve mantıksal birimle donatılmış 360/91 , hangisini daha fazla belirleyemeden , bazen belirli bir adresin "çevresinde" bir KESİNTİSİZ KESİNTİ (kötü şekilde yerelleştirilmiş sapma) bildirdi .
Bu tehlikeler, talimat setinin yan etkileri olmayan talimatlarla sınırlandırılmasıyla önlenebilir. En kötü durumda, ek devre kenar etkilerini algılar ve içindeki bir sonraki talimat atanan değerlere bağlıysa boru hattını geçersiz kılar. Bu nedenle hesaplama biraz gecikmeli.
Uzantı olarak, bir operatör için, işlenenlerinden birinin değerini değiştirdiğinde bir yan etkiye sahip olduğunu söylüyoruz .
İşlemden kaynaklanan değer kullanılabilir (örneğin bir değişkende saklanabilir veya bir işlevin parametresi olarak aktarılabilir), ancak bu tür operatörler genellikle yalnızca yan etkileri için kullanılır. Sonucu göz ardı edilen bir işlemi içeren ifade, daha sonra bir talimat haline gelir.
C ++ örnekleri:
++x; // ++ incrémente x c = b += a; // le résultat de += est stocké dans c mais celui de = est ignoréAtama operatörü =genellikle yanlışlıkla eşitlik operatörü yerine kullanılır ==. Onun yan etkisi onun değiştirmektir 1 st onun değerini atayarak operand 2 nd işlenen. Sonuç, atanan değerdir.
if (x = 0) { // x est modifiée et devient 0 std::cout << "nul"; // "nul" n'est jamais affichée car x = 0 renvoie toujours 0 }Bir yan etkiye sahip olmamak, referans şeffaflığı için gerekli ancak yeterli bir koşul değildir . Bilgi şeffaflığı, bir ifadenin (bir işlev çağrısı gibi) programın davranışını etkilemeden değeriyle değiştirilebileceği anlamına gelir. Bu nedenle ifade saf olmalı , yani aynı girdiler için aynı değere sahip olmalı ve değerlendirilmesinin yan etkileri olmamalıdır. Yan etkileri olmayan bir işlev, geçmişine veya dış ortamına bağlı olarak farklı değerler döndürebilir, örneğin çıktısı sırasıyla bir statik yerel değişkenin veya yerel olmayan bir değişkenin değerine bağlıysa.
Bu program standart çıktıya yazdırır:
0 1Fonksiyonun yan etkisi f, global değişkenin değerini değiştirmektir x.