0
votes

Qu'est-ce que l'opérateur de tableau "-" (un trait d'union ou un tiret) signifie-t-il et faire en C?

Je prends un cours dans les systèmes d'exploitation et nous avons été attribués au "Projet 1 Unix Shell et Caractéristiques de l'histoire", comme l'a été trouvé dans Abraham Silberschatz Systems d'exploitation PG 157. Je faisais des recherches sur le problème et je suis passé un code GitHub intéressant. Il comprenait une déclaration "sinon si" avec un opérateur que je n'ai jamais vu auparavant (un tiret -). J'essaie de savoir ce que ça fait.
(link) https: // github .COM / DESPAKAVS / UNIX-Shell-and-History-Feature-C / BLOB / MASTER / shooth2.c

else if (args[0][0]-'!' ==0)
{   int x = args[0][1]- '0'; 
    int z = args[0][2]- '0'; 


6 commentaires

C'est un "moins"!


Ce n'est pas un opérateur de tableau; C'est juste un signe moins, soustraire la valeur (ASCII) de ! de tout ce qui est stocké dans args [0] [0] .


Vous hommes le arithmétique moins opérateur ?


Au fait, il serait beaucoup plus facile de lire et de comprendre s'il était si (args [0] [0] == '!')


(Ugh, je veux dire ASCII, non ASCII.)


Merci beaucoup à tous. Je n'ai pas vu ce style de mission de tableau avant et c'était très déroutant.


4 Réponses :


6
votes

args [0] [1] - '0' est la manière idiomatique de convertir une valeur char qui représente un chiffre sur la valeur numérique de ce chiffre. Cela fonctionne pour tous les codages pris en charge par c.

args [0] [0] - '!' ' == 0 est une manière flasheuse de tester si args [0] [0] a la même valeur que '!' . L'auteur a un idiosyncratique, peut-être quixotique, sens de symétrie: la plupart des gens écrivent args [0] [0] == '!' . .


10 commentaires

Tous les codages? J'ai toujours eu l'impression que cette relation était unique à ASCII.


@GovindParmar: Non, c supporte uniquement les codages où 0 à 9 sont consécutifs. Vous avez raison sur les caractères alpha.


@Govindparmar Il est nécessaire pour les chiffres, mais pas pour aucun autre caractère.


Personnellement, j'écris toujours args [0] [0] == (! '!' ??! '!' ??! ') Pour vérifier si quelque chose est égal à . Beaucoup plus flashier.


@Lundin n'utilisez-vous pas / ** / au lieu d'un espace aussi?


@Bathsheba Nope, j'utilise #define espace (A, B) A B .


Merci beaucoup à tous. Je n'ai pas vu ce style de mission de tableau avant et c'était très déroutant.


@Bathsheba Juste pour la clarté, dans ce code Snippet "Int x = args [0] [1] - '0'" Est-ce que cela tapez essentiellement la coulée de caractère à int?


@Bathsheba Cela fait partie d'un programme qui crée une interface de commande shell UNIX. Les arguments seraient des commandes entrées par l'utilisateur, EXP (PS, LS, Histoire, etc.)


Dans ce cas, cet argument est converti en int - '0' est déjà un int.



1
votes

C'est l'opérateur de soustraction binaire. Un "moins" mathématique si vous voulez.

Dans ce cas spécifique, il est utilisé pour soustraire la valeur de symbole de '0' à partir d'un chiffre, pour convertir du symbolique en entiers.


1 commentaires

@Bathsheba meh, bien tout ce qui est codé, ils se produisent. ASCII est le plus souvent mentionné dans les exemples de livres scolaires.



2
votes

C'est la soustraction. Char Les valeurs sont également numériques et peuvent être ajoutées, soustraites, multiplies et divisées les unes des autres comme tout autre type numérique.

Qu'est-ce qui se passe spécifiquement dans votre code, c'est que le jeu de caractères utilisé par votre compilateur C a des relations utiles, comme la représentation textuelle d'un chiffre est exactement '0' plus élevé que le numéro chiffre. Valeur pour ce chiffre, alors soustrayez '0' vous donnera le chiffre lui-même. Ceci est vrai de tous les codages supportés par c.

La première comparaison pourrait tout aussi facilement avoir été aussi facilement (code> si (args [0] [0] == '!') , à la manière.


3 commentaires

"L'ASCII a des relations utiles, comme la représentation textuelle d'un chiffre correspond exactement à" 0 "supérieure à la valeur numérique réelle de ce chiffre, de soustraire" 0 'vous donnera le chiffre lui-même ". - Ceci est vrai pour tous les codages supportés par C.


Merci. Avoir un uppot! Enfin, je ne peux pas résister, notez que '0' est un type int C. (cf. c ++).


@Bathsheba a mis à jour ma réponse pour refléter ce que j'ai appris il y a quelques secondes sur votre réponse. :)



0
votes

Comme les caractères ne sont que des nombres uniquement en interne, args [0] [0] - '!' ' == 0 vérifie si le premier caractère du premier argument est égal à '!' . args [0] [1] - '0' convertit les caractères à leur valeur numérique.


0 commentaires