2017-08-09 10 views
0

J'ai récemment essaye d'exécuter ce code dans ideone.com ...Pourquoi ideone.com fait cela?

#include <iostream> 
#include <string> 

using namespace std; 

int getVal(string name) 
{ 
    if (name == "Devashish") return 0; 
    return 1; 
} 

int main() 
{ 
    cout << 5/getVal("Devashish"); 
    return 0; 
} 

Il est intéressant, ce code n'a pas jeté une exception et imprimé 5 en sortie. Le code est intentionnellement écrit pour produire une exception. Voici le lien ideone vers la compilation réussie et l'exécution du code bogué: http://ideone.com/ogDzDU

Lorsque j'ai essayé d'exécuter le même code sur Visual Studio, j'ai reçu une exception (ce qui était attendu). Juste curieux. Pourquoi idéone s'est comporté ainsi? Est-ce un bug dans leurs compilateurs ou un autre programme?

+0

https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633 –

+0

Visual Studio et un autre outil en ligne ont donné des exceptions, donc j'ai pensé qu'il soulèverait une exception. Même si ce n'est pas ça, est-ce que ideone donne ce qui est attendu? –

+0

* "est-ce que ideone donne quoi de prévu?" * Le comportement indéfini n'est pas défini, donc n'importe quel résultat peut être appelé "comme prévu". –

Répondre

5

La division par zéro dans un programme C++ a un comportement strictement indéfini.

Cela signifie que personne ne peut dire comment votre programme va se comporter. Il pourrait déclencher une exception, mais il n'y a aucune garantie que ce sera le cas. Il pourrait aussi bien fonctionner et vous laisser perplexe, comme vous êtes maintenant.

C'est la nature de UB. Vous ne devriez certainement pas avoir UB dans votre code, car alors seulement vous pouvez raisonner à ce sujet. Mais en laissant le comportement indéfini, le standard C++ donne aux implémentations de grandes opportunités d'optimisation. Ils n'ont pas besoin d'ajouter constamment des contrôles qui soulèvent des exceptions lorsque nous en tant que programmeurs bousiller.

+0

J'ai dû lire cette phrase deux fois, j'ai essayé de le rendre moins malentendu. Bien, pas de locuteur natif ici ... – user463035818

+0

@ tobi303 - Si ça aide, bien sûr. Je ne pense pas que ce soit strictement nécessaire du point de vue linguistique, mais je ne suis pas non plus un locuteur natif. – StoryTeller