Faits :
A.
Par jugement du 17 mai 2018, le Tribunal correctionnel de l'arrondissement de la Broye et du Nord vaudois a condamné X._, pour infraction grave à la LStup, à une peine privative de liberté de 48 mois. Il a en outre ordonné son expulsion du territoire suisse pour une durée de sept ans.
B.
Par jugement du 30 août 2018, la Cour d'appel pénale du Tribunal cantonal du canton de Vaud a partiellement admis l'appel formé par X._ contre ce jugement et a réformé celui-ci en ce sens que le prénommé est condamné, pour infraction grave à la LStup, à une peine privative de liberté de 36 mois, son expulsion du territoire suisse étant ordonnée pour une durée de cinq ans.
La cour cantonale a retenu les faits suivants.
B.a. X._ est né en 1977 au Sénégal, pays dont il est ressortissant. Au terme de sa scolarité obligatoire, il a suivi une formation de couturier, achevée avec succès, avant de travailler, en Afrique, durant dix ans dans ce domaine. Il a été incorporé dans le contingent sénégalais des A._ de l'ONU et a rempli des missions au Soudan, au Liban et en Guinée Bissau. Il a quitté son pays en refusant d'aller servir en Côte d'Ivoire. X._ est venu en Europe en transitant par l'Espagne puis la France. Il est arrivé en Suisse en 2008 et y a demandé l'asile, ce qui lui a été refusé. Malgré ce refus, le prénommé est resté illégalement dans le pays. Il s'y est marié en 2013 et a eu deux enfants, nés en 2012 et 2016, de nationalité suisse. X._ était titulaire d'une autorisation de séjour, échue en mai 2018. Il a entrepris une formation de magasinier, avant de travailler, dès février 2017 et jusqu'à son interpellation en juin 2017, en qualité d'éboueur pour la commune de B._.
Ensuite de l'arrestation de X._ en juin 2017, son épouse a déposé une requête de mesures protectrices de l'union conjugale. Une convention a été ratifiée en septembre 2017, la garde des enfants ayant été confiée à l'intéressée. Une demande unilatérale de divorce a par la suite été déposée par l'épouse de X._.
Le casier judiciaire du prénommé fait état d'une condamnation, en 2010, pour entrée illégale et séjour illégal, de trois autres condamnations, la même année, pour séjour illégal, d'une condamnation, en 2011, pour séjour illégal et infraction à la LStup, ainsi que d'une condamnation, en 2012, pour séjour illégal et contravention à la LStup.
B.b. A C._, entre l'été 2014 et le 21 juin 2017, X._ a vendu ou s'apprêtait à vendre pour le moins 837 g bruts de cocaïne, ce qui représente au minimum 234 g de cocaïne pure, ainsi qu'au moins 15 g de marijuana.
C.
X._ forme un recours en matière pénale au Tribunal fédéral contre le jugement du 30 août 2018, en concluant, avec suite de frais et dépens, principalement à sa réforme en ce sens que son expulsion du territoire suisse n'est pas ordonnée et, subsidiairement, à son annulation et au renvoi de la cause à l'autorité cantonale pour nouvelle décision. Il sollicite par ailleurs l'octroi de l'effet suspensif et le bénéfice de l'assistance judiciaire.
Par courrier du 29 octobre 2018, le Président de la Cour de droit pénal a indiqué que le recours en matière pénale interjeté contre un prononcé d'expulsion déployait de lege un effet suspensif, de sorte que la demande d'effet suspensif était sans objet et qu'il n'y avait dès lors pas lieu de statuer sur celle-ci.
Considérant en droit :
1.
Le recourant soutient que la cour cantonale aurait dû renoncer à ordonner son expulsion du territoire suisse sur la base de l'art. 66a al. 2 CP.
1.1. Aux termes de l'art. 66a al. 1 let. o CP, le juge expulse de Suisse l'étranger qui est condamné notamment pour infraction à l'art. 19 al. 2 LStup, quelle que soit la quotité de la peine prononcée à son encontre, pour une durée de cinq à quinze ans. Selon l'art. 66a al. 2 CP, le juge peut exceptionnellement renoncer à une expulsion lorsque celle-ci mettrait l'étranger dans une situation personnelle grave et que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse. A cet égard, il tiendra compte de la situation particulière de l'étranger qui est né ou qui a grandi en Suisse.
En l'espèce, le recourant a commis une infraction (infraction à l'art. 19 al. 2 LStup) qui tombe sous le coup de l'art. 66a al. 1 let. o CP. Il remplit donc a priori les conditions d'une expulsion, sous la réserve d'une application de l'art. 66a al. 2 CP, voire également des normes de droit international.
1.2. L'art. 66a al. 2 CP est formulé comme une norme potestative ("Kannvorschrift"), en ce sens que le juge n'a pas l'obligation de renoncer à l'expulsion, mais peut le faire si les conditions fixées par cette disposition sont remplies. Ces conditions sont cumulatives. Afin de pouvoir renoncer à une expulsion prévue par l'art. 66a al. 1 CP, il faut donc, d'une part, que cette mesure mette l'étranger dans une situation personnelle grave et, d'autre part, que les intérêts publics à l'expulsion ne l'emportent pas sur l'intérêt privé de l'étranger à demeurer en Suisse (arrêts 6B_965/2018 du 15 novembre 2018 consid. 4.2; 6B_724/2018 du 30 octobre 2018 consid. 2.3.1; 6B_506/2017 du 14 février 2018 consid. 1.1 et les références citées). Le fait que la clause de rigueur soit une norme potestative ne signifie pas que le juge pénal pourrait librement décider d'appliquer ou non l'exception de l'art. 66a al. 2 CP. Le juge doit faire usage du pouvoir d'appréciation qui lui est conféré par une norme potestative dans le respect des principes constitutionnels. S'il devait refuser de renoncer à l'expulsion alors que les conditions de la clause de rigueur sont remplies, le principe de proportionnalité ancré à l'art. 5 al. 2 Cst. serait violé. Le juge doit ainsi renoncer à l'expulsion lorsque les conditions de l'art. 66a al. 2 CP sont réunies, conformément au principe de proportionnalité (arrêts 6B_965/2018 précité consid. 4.2; 6B_724/2018 précité consid. 2.3.1).
1.3. La loi ne définit pas ce qu'il faut entendre par une "situation personnelle grave" (première condition cumulative) ni n'indique les critères à prendre en compte dans la pesée des intérêts (seconde condition cumulative).
En règle générale, il convient d'admettre l'existence d'un cas de rigueur au sens de l'art. 66a al. 2 CP lorsque l'expulsion constituerait, pour l'intéressé, une ingérence d'une certaine importance dans son droit au respect de sa vie privée et familiale garanti par la Constitution fédérale (art. 13 Cst.) et par le droit international, en particulier l'art. 8 CEDH (arrêts 6B_ 965/2018 précité consid. 4.3; 6B_724/2018 précité consid. 2.3.2; 6B_371/2018 du 21 août 2018 consid. 2.5).
La cour cantonale a considéré que le recourant pouvait se prévaloir d'un droit au respect de sa vie familiale au sens de l'art. 8 par. 1 CEDH, en raison de la présence en Suisse de ses deux enfants. On peut douter qu'en l'état le recourant entretienne avec ceux-ci un lien particulièrement fort, au sens de la jurisprudence (cf. ATF 144 I 91 consid. 5 p. 96 ss; 143 I 21 consid. 5.3 p. 27 s.), dès lors que leur garde a été attribuée à la mère, que l'intéressé n'est astreint à aucune contribution d'entretien et ne bénéficie pas d'un droit de visite (cf. pièce 30/2 du dossier cantonal). Quoi qu'il en soit, à supposer que le recourant puisse se prévaloir d'un droit découlant de l'art. 8 par. 1 CEDH - qu'il s'agisse de sa vie familiale ou de sa vie privée comme le soutient également le recourant -, son expulsion pourrait de toute manière être confirmée au regard de l'art. 8 par. 2 CEDH (cf. consid. 1.4.2 infra).
1.4. Il convient de déterminer si l'intérêt privé du recourant à demeurer en Suisse pourrait l'emporter sur les intérêts publics présidant à son expulsion. Cet examen implique en particulier de déterminer si la mesure litigieuse respecte le principe de la proportionnalité découlant des art. 5 al. 2 Cst. et 8 par. 2 CEDH (cf. arrêts 6B_1027/2018 du 7 novembre 2018 consid. 1.5; 6B_724/2018 précité consid. 2.5; 6B_371/2018 précité consid. 3.2).
1.4.1. La cour cantonale a exposé que le recourant était arrivé en Suisse en 2008 et y avait vécu sans titre de séjour valable, jusqu'à son mariage avec une Suissesse lui ayant permis d'obtenir une autorisation de séjour. Celui-ci avait été condamné à six reprises pour séjour illégal. Il avait entrepris une formation, accompli des stages, puis travaillé entre février et juin 2017, époque à laquelle il avait été arrêté. Les infractions commises étaient graves, compte tenu de l'importante quantité de cocaïne vendue. Les explications du recourant, selon lesquelles il ne parvenait pas à payer ses factures malgré le fruit de son travail, n'étaient pas convaincantes, puisque l'intéressé bénéficiait d'aides, sous forme notamment de prestations complémentaires famille. Le recourant était âgé de 41 ans et vivait en Suisse depuis une dizaine d'années. La durée de son séjour en Suisse n'était pas telle qu'elle justifiait de renoncer à son expulsion. Le recourant n'était pas bien intégré en Suisse d'un point de vue social et professionnel. Ses allégations, selon lesquelles il serait considéré comme un déserteur au Sénégal, ne reposaient que sur ses déclarations. Celles-ci paraissaient peu crédibles, compte tenu de l'âge de l'intéressé et de son affectation dans les A._ sénégalais. Le recourant avait des cousins au Sénégal, auxquels il envoyait de l'argent, ainsi que des frères et son père en Italie et en France. Il souffrait depuis 2014 d'une hyperthyroïdie sur maladie de Basedow, avec suspicion d'orbitopathie basedowienne. Dans un certificat médical du 28 juin 2018, le Service médical de D._ avait indiqué que l'intéressé avait besoin d'un suivi endocrinologique ainsi que de contrôles ophtalmologiques. Il était en outre relevé qu'une non accessibilité aux soins serait délétère pour sa santé. Selon la cour cantonale, si des soins étaient nécessaires, rien n'indiquait que ceux-ci ne soient pas disponibles hors de Suisse et en particulier au Sénégal. Une simple recherche sur Internet permettait ainsi de se rendre compte qu'à l'Hôpital universitaire de Dakar une prise en charge était possible. Il n'existait donc pas de motif médical impérieux justifiant le séjour du recourant en Suisse. Enfin, le recourant avait deux enfants en bas âge en Suisse, auxquels il était très attaché, puisqu'il leur versait notamment les faibles revenus qu'il réalisait en détention. Ces éléments ne contrebalançaient toutefois pas l'intérêt public à son expulsion du territoire suisse.
1.4.2. En l'espèce, les intérêts présidant à l'expulsion du recourant sont importants, dès lors que celui-ci s'est livré à un important trafic de stupéfiants. A cet égard, on rappellera que la Cour européenne des droits de l'Homme estime que, compte tenu des ravages de la drogue dans la population, les autorités sont fondées à faire preuve d'une grande fermeté à l'encontre de ceux qui contribuent à la propagation de ce fléau (cf. arrêts CourEDH K.M. c. Suisse du 2 juin 2015 [requête no 6009/10] § 55; Dalia c. France du 19 février 1998, Recueil CourEDH 1998-I 76 § 54; cf. aussi arrêt 6B_1027/2018 précité consid. 1.5.2). Par ailleurs, il convient de relever que la peine privative de liberté à laquelle a été condamné le recourant dépasse une année, ce qui aurait permis une révocation, à l'époque où l'intéressé en jouissait encore, de son autorisation de séjour sur la base de l'art. 62 al. 1 let. b LEtr (cf. l'arrêt publié aux ATF 139 I 145 consid. 2.1 p. 147, selon lequel constitue une "peine privative de liberté de longue durée" au sens de la disposition précitée toute peine dépassant un an d'emprisonnement). En outre, de manière générale, le respect de l'ordre juridique suisse ne préoccupe guère le recourant, lequel avait déjà fait l'objet de six condamnations avant la présente cause.
Le recourant est arrivé en Suisse à l'âge adulte et n'y a passé qu'une dizaine d'années, dont environ la moitié en situation illégale. Son intégration en Suisse ne s'avère pas particulièrement réussie. L'intéressé ne revendique aucune relation sociale ou professionnelle particulière. Il n'a en définitive travaillé en Suisse que durant quelques mois. Rien ne permet de considérer que le recourant se réintégrerait désormais plus difficilement au Sénégal - où il possède encore de la famille et où il a déjà travaillé par le passé - qu'en Suisse. Le temps écoulé depuis la commission des infractions n'est pas important. Il ressort par ailleurs du jugement attaqué que le comportement du recourant durant cette période - soit en détention - a été bon.
Le recourant reproche à la cour cantonale d'avoir ignoré certains éléments plaidant pour une application de l'art. 66a al. 2 CP. Outre des éléments qui ressortent expressément du jugement attaqué - ainsi les stages effectués en Suisse, son travail d'éboueur, l'existence de ses deux enfants, les excuses présentées lors des débats -, celui-ci évoque cependant des aspects - comme la bonne image qu'ont de lui l'un de ses anciens collègues et ses anciens employeurs, ou encore sa prise de conscience - dont on voit mal en quoi ils fonderaient un cas de rigueur (cf. concernant les critères pertinents les arrêts 6B_724/2018 précité consid. 2.3.2; 6B_371/2018 précité consid. 2.5). Le recourant s'écarte par ailleurs de l'état de fait de la cour cantonale, par lequel le Tribunal fédéral est lié (cf. art. 105 al. 1 LTF), lorsqu'il affirme avoir "travaillé assidûment, en tous les cas depuis 2014 jusqu'à son incarcération en juin 2017", ou lorsqu'il prétend ne pas avoir agi par appât du gain.
Contrairement à ce qu'affirme le recourant, la cour cantonale n'a nullement ignoré la maladie dont il souffre. L'intéressé ne conteste pas qu'un traitement serait disponible au Sénégal, mais se contente d'affirmer - sans autre développement - qu'il n'aurait pas les moyens financiers d'obtenir celui-ci. Ce faisant, il ne démontre aucunement qu'une expulsion du territoire suisse le priverait de soins dont il a impérativement besoin. Il convient pour le surplus de rappeler que, selon la jurisprudence fédérale en matière de droit des étrangers, un étranger ne peut se fonder sur l'existence de prestations médicales supérieures en Suisse pour s'opposer à son renvoi dans un pays où le traitement dont il a besoin s'avère disponible (cf. arrêts 6B_706/2018 du 7 août 2018 consid. 2.5; 2C_218/2017 du 17 juillet 2017 consid. 5.3).
Pour le reste, le mariage du recourant ne saurait étayer son intérêt privé à demeurer en Suisse, puisque ce dernier ne fait plus ménage commun avec son épouse et que celle-ci a entamé une procédure de divorce.
En définitive, compte tenu de la gravité des infractions sanctionnées en matière de stupéfiants et de la médiocre intégration du recourant en Suisse, l'intérêt public à l'expulsion l'emporte sur l'intérêt privé de l'intéressé à demeurer en Suisse. La réintégration au Sénégal, pays dans lequel celui-ci a grandi, a passé la majeure partie de sa vie et avec lequel il conserve des liens culturels et familiaux, ne sera pas particulièrement difficile. Il n'apparaît pas que le recourant s'y trouvera dans une situation sensiblement plus défavorable ni qu'il disposerait, en Suisse, de meilleures chances de réinsertion sociale. L'expulsion portera certes une atteinte aux relations entre le recourant et ses enfants - avec lesquels l'intéressé ne fait plus ménage commun -, mais il convient de relever que cette mesure reste d'une durée limitée - soit cinq années - et ne l'empêchera pas d'entretenir un contact avec ceux-ci par le biais des moyens de communication modernes (cf. ATF 144 I 91 consid. 5.1 p. 97).
Dans ces circonstances, l'expulsion s'avère conforme au principe de la proportionnalité.
1.5. La seconde condition pour l'application de l'art. 66a al. 2 CP n'étant pas réalisée, la cour cantonale n'a pas violé le droit fédéral, constitutionnel ou international en ordonnant l'expulsion du recourant pour une durée de cinq ans.
2.
Le recourant soutient que son expulsion du territoire suisse violerait l'art. 3 CEDH, car il risquerait, dans son pays d'origine, une peine capitale. Aucun grief portant sur cette disposition n'a été traité dans le jugement attaqué, sans que le recourant ne se plaigne d'un déni de justice à cet égard. Partant, le grief est irrecevable, faute d'épuisement des instances cantonales (cf. art. 80 al. 1 LTF).
Au demeurant, l'argumentation du recourant repose intégralement sur la prémisse - découlant de ses seules allégations - selon laquelle il serait considéré comme un déserteur au Sénégal et risquerait, en conséquence, d'y être sanctionné. Or, la cour cantonale n'a pas retenu que tel était le cas, sans que le recourant ne démontre en quoi l'autorité précédente aurait, sur ce point, versé dans l'arbitraire (cf. art. 97 al. 1 LTF).
3.
Le recours doit être rejeté dans la mesure où il est recevable. Comme il était dénué de chances de succès, la demande d'assistance judiciaire doit être rejetée (art. 64 al. 1 LTF). Le recourant, qui succombe, supportera les frais judiciaires (art. 66 al. 1 LTF), dont le montant sera fixé en tenant compte de sa situation financière, laquelle n'apparaît pas favorable.
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
La demande d'assistance judiciaire est rejetée.
3.
Les frais judiciaires, arrêtés à 1'200 fr., sont mis à la charge du recourant.
4.
Le présent arrêt est communiqué aux parties et à la Cour d'appel pénale du Tribunal cantonal du canton de Vaud.
Lausanne, le 14 décembre 2018
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
Le Greffier : Graa