当前位置:网站首页>Langage C - démarrer - base - syntaxe - [opérateur, conversion de type] (vi)
Langage C - démarrer - base - syntaxe - [opérateur, conversion de type] (vi)
2022-07-04 08:48:00 【Hu Anmin】
Concepts de base de l'opérateur
Comme les opérateurs en mathématiques, CUn opérateur dans une langue est un symbole qui indique au Programme d'effectuer une opération arithmétique ou logique spécifique
Qu'est - ce qu'une expression: Les expressions sont des significations liées par des opérateurs,Déclarations avec résultats; Par exemple: a + b; C'est une expression arithmétique, Ça veut dire ajouter deux nombres, Le résultat de l'addition de deux nombres est le résultat de l'expression Attention!: L'expression doit avoir un résultat
Classification des opérateurs
Par fonction:
- Opérateur arithmétique
- Opérateur d'affectation
- Opérateur relationnel
- Opérateurs logiques
- Opérateur de bits
Divisé par le nombre d'opérandes participant à l'opération:
- Opération monoculaire , Un seul opérande Par exemple: : i++;
- Opération binoculaire , Il y a deux opérandes Par exemple: : a + b;
- Opération triculaire , CLa seule langue,Aussi connu sous le nom d'expression de point d'interrogation Par exemple:: a>b ? 1 : 0;
Priorité et combinabilité des opérateurs
Dans les manuels de maths de l'école primaire,On a juste appris"De gauche à droite,Multiplier et diviser puis ajouter et soustraire,Ceux entre parenthèses comptent d'abord", Cette phrase implique des questions de priorité et de combinabilité
CDans la langue,La priorité opérationnelle de l'opérateur est divisée en15 Niveau.1 Niveau le plus élevé,15 Niveau le plus bas
- InCDans les expressions linguistiques,Opérateurs de différentes priorités, L'ordre de fonctionnement est exécuté de haut en bas
- InCDans les expressions linguistiques,Opérateurs de même priorité, L'ordre de fonctionnement doit être exécuté dans la direction spécifiée par l'Union
Opérateur arithmétique
Notes
- Si les deux opérandes impliqués dans l'opération sont des entiers , Donc le résultat est aussi un entier
- Si l'un des deux opérandes participant à l'opération est un nombre flottant , Donc le résultat doit être un nombre flottant
- Opérateur de récupération, C'est essentiellement le quotient et le surplus des mathématiques ,Reste dans
- Opérateur de récupération, Les deux opérandes participant à l'opération doivent être des entiers , Impossible d'inclure un nombre flottant
- Opérateur de récupération, Le diviseur est inférieur au diviseur, Donc le résultat est divisé par
- Opérateur de récupération, La positivité et la négativité du résultat de l'opération dépendent du diviseur , Ça n'a rien à voir avec le diviseur , Le diviseur est un nombre positif le résultat est un nombre positif ,Divisé par
- C'est négatif, c'est négatif
- Opérateur de récupération, Diviser par0, Les résultats sont les suivants:0
- Opérateur de récupération, Diviser par0, Ça n'a aucun sens(Ne dis pas ça.)
Opérateur d'affectation
Opérateur d'affectation simple
Opérateur d'affectation composé
Combinability and priority
Opérateur auto - incrémental et auto - décrémental
Dans la programmation,Souvent rencontré“i=i+1”Et“i=i-1” Ces deux opérations très courantes .C Le langage fournit deux opérateurs plus concis pour cette opération ,C'est - à - dire:++
Et--
Si elle apparaît dans une expression , Les symboles sont écrits avant et après.
Expression préfixe:
++x, --x;
Parmi euxxReprésente le nom de la variable, Complétez d'abord l'auto - augmentation et l'auto - diminution de la variable 1Opération,Réutiliserx La valeur de est utilisée comme
Valeur;C'est - à - dire:“ Changez d'abord, puis utilisez ”, C'est - à - dire que la valeur de la variable change d'abord , Participer à l'opération avec la valeur de la variableExpression du suffixe:
x++, x--;
D'abord.x La valeur actuelle de est la valeur de l'expression , Puis auto - augmentation et auto - diminution 1Opération.C'est - à - dire:“ Utiliser d'abord, puis changer ”,- Oui.
C'est - à - dire qu'il faut d'abord participer à l'opération avec la valeur de la variable , La valeur de la variable est ensuite augmentée et diminuée
Auto - augmentation:
S'il n'y a qu'une seule variable, Peu importe.++ Écrivez devant ou derrière les variables +1Fonctionnement
Si l'opération de participation auto - incrémentale
À déduire
Attention!:
- Auto - augmentation、 L'auto - soustraction ne peut être utilisée que pour une seule variable , Tant qu'il s'agit d'une variable de type standard ,Qu'il soit entier、Type solide, Ou une variable de type caractère
Attendez., Mais ne peut pas être utilisé avec des expressions ou des constantes ,Mauvaise utilisation:++(a+b);
- Essayez de
++ --
Seul, Essayez de ne pas mélanger avec d'autres opérateurs
Remplacer par le code suivant
C Les normes linguistiques ne sont pas clairement définies , Comment fonctionne la même variable dans la même expression après auto - augmentation ou auto - diminution , Différents compilateurs obtiennent des résultats différents , N'écrivez jamais ça dans le développement de l'entreprise
sizeofOpérateur
sizeof Peut être utilisé pour calculer une variable ou une constante 、 Nombre d'octets de mémoire pris par le type de données
Format standard: sizeof(Constante or Variables);
sizeof()Et+=、*=
C'est aussi un opérateur composé , ParsizeofEt()Composé de deux parties, Mais représente un tout
Alors...sizeofPas une fonction, C'est un opérateur, La priorité de cet opérateur est 2
sizeofPlusieurs formes de:
// sizeof( Variables\Constante );
sizeof(10);
char c = 'a';
sizeof(c);
//sizeof Variables\Constante;
sizeof 10;
char c = 'a';
sizeof c;
// sizeof( Type de données);
sizeof(float); // Les parenthèses ne peuvent pas être omises pour les types de données
Opérateur de virgule
- InCVirgule dans la langue“,”C'est aussi un opérateur.,Appelé opérateur virgule. Sa fonction est de relier plusieurs expressions pour former une expression,Expression appelée virgule
- L'opérateur virgule récupère la valeur de chaque expression de gauche à droite , La valeur de la dernière expression entière de virgule est égale à
Valeur - Format:
Expression1,Expression2,… …,Expressionn;
#include <stdio.h>
int main(){
int a=2,b=4,x,y;
y=(x=a+b,b+x); // Dans une expression virgule , La dernière opération est la valeur finale ,Et ensuite assigner une valeur ày
printf("y=%d, x=%d \n",y,x);// y=10, x=6
return 0;
}
Opérateur relationnel
Par défaut, Chaque mot de code correct que nous écrivons dans le programme est exécuté .Mais la plupart du temps,, Nous voulons exécuter un morceau de code seulement si une condition est remplie , Dans ce cas, une déclaration conditionnelle peut être utilisée pour compléter , Mais avant d'apprendre l'énoncé des conditions , Regardons d'abord quelques connaissances de base :
Comment déterminer si une condition est valide , C Le vrai et le faux dans la langue , InCDans la langue, Les conditions d'établissement sont appelées “C'est vrai.”, Une condition non valable est appelée “Faux”,Donc,,Déterminer si les conditions sont vraies, Est de juger les conditions “Vrai ou faux”
Comment juger le vrai ou le faux ?CDispositions linguistiques, Toute valeur est vraie ou fausse ,Tout non0Toutes les valeurs sont“C'est vrai.”,Seulement0Juste pour“Faux”.C'est - à - dire,108、-18、4.5、-10.5Attends.“C'est vrai.”
,0Oui.“Faux
L'opérateur relationnel fonctionne avec seulement 2Espèce:Si les conditions sont réunies,Le résultat est1,C'est - à - dire“C'est vrai.”;
Si les conditions ne sont pas remplies,Résultats C'est tout.0,C'est - à - dire“Faux
Priorité et intégration
Attention!: Que ce soitfloatToujoursdouble Il y a des problèmes de précision , Évitez donc d'utiliser ==Déterminer si le nombre de points flottants est égal
Opérateurs logiques
Priorité | Nom | Symbole | Description |
---|---|---|---|
2 | Logique non - opérateur | ! | Opérateur monoculaire,Avec liaison droite |
11 | Logique et opérateur | && | Opérateur binoculaire,Avec liaison gauche |
12 | Logique ou opérateur | || | Opérateur binoculaire,Avec liaison gauche |
La logique n'est pas
Format: ! ConditionsA; (C'est faux,Faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux faux)
Logique et
Format: ConditionsA && ConditionsB;
Résultat de l'opération:Un faux est un faux , Ce qui veut dire que tout est vrai, alors c'est vrai
Processus de calcul:
- Toujours juger en premier "ConditionsA"Oui Non,Si"ConditionsA"Fondé,On verra."ConditionsB"Oui Non, Si"ConditionsB"C'est vrai.,Le résultat est1,C'est - à - dire:“C'est vrai.”
- Si"ConditionsA"Fondé,"ConditionsB"C'est faux.,Le résultat est0,C'est - à - dire:“Faux”
- Si"ConditionsA"C'est faux., Ne jugez plus jamais "ConditionsB"Oui Non, Parce que la logique n'est pas vraie tant qu'un résultat n'est pas vrai
Attention à l'utilisation: ConditionsA"Faux., "ConditionsB"Ne sera pas exécuté
Logique ou
Format: ConditionsA || ConditionsB;
Résultat de l'opération:C'est vrai.
Processus de calcul:
- Juge d'abord"ConditionsA"Oui Non
- Si"ConditionsA"C'est faux.,On verra."ConditionsB"Oui Non, Si"ConditionsB"Fondé,Le résultat est1,C'est - à - dire:“C'est vrai.”
- Si"ConditionsA"C'est faux.,"ConditionsB" Elle n'est pas non plus fondée , Le résultat est0,C'est - à - dire:“Faux”
- Si"ConditionsA"Fondé, Ne jugez plus jamais "ConditionsB"Oui Non, Parce que la logique ou un seul résultat est vrai
Attention à l'utilisation: "ConditionsA"C'est vrai., "ConditionsB"Ne sera pas exécuté
Opérateur tridimensionnel
Opérateur tridimensionnel,Il a besoin3 Les données ou expressions constituent une expression conditionnelle
Format1: Expression1?(RésultatsA):(RésultatsB)
Format2: Expression1?Expression2:Expression3
Exemple: Réussir l'examen ? Réussite : Échec;
Règles d'évaluation : Si"Expression1"C'est vrai., Le résultat de l'opération de l'opérateur tridimensionnel est (RésultatsA),Sinon(RésultatsB)
On peut aussi faire des complications int res = a>b?a:(c>d?c:d);
Conversion de type
La conversion de type de données consiste à convertir les données (Variables、Valeur numérique、Résultat de l'expression, etc)Conversion d'un type à un autre.
Conversion automatique de type
La conversion automatique de type est le compilateur silencieusement、Implicitement、Conversion furtive du type de données,Cette transformation n'exige pas l'intervention du programmeur,Se produit automatiquement. La conversion automatique de type se produit lorsqu'un type de données est attribué à un autre type de variable ,Par exemple:
//100 - Oui. int Type de données,Doit être converti en float Le type peut être attribué à la variable f.
float f = 100;
//Encore une fois.:f - Oui. float Type de données,Doit être converti en int Le type peut être attribué à la variable n.
int n = f;
Dans une opération d'affectation, Les types de données diffèrent des deux côtés du numéro d'affectation , Vous devez convertir le type d'expression de droite en type de variable de gauche , Cela peut entraîner une distorsion des données , Ou une précision réduite ;Alors dis, La conversion automatique de type n'est pas nécessairement sûre . Pour les conversions de type dangereuses , Le compilateur donne généralement un avertissement .
Dans différents types d'opérations hybrides,Le compilateur convertit également automatiquement les types de données,Convertit d'abord toutes les données impliquées dans l'opération au même type,Puis on calcule.Les règles de conversion sont les suivantes:
- La conversion est effectuée dans la direction où la longueur des données augmente,Pour s'assurer que la valeur n'est pas déformée,Ou la précision ne diminue pas.Par exemple,int Et long Lors de la participation à l'opération,D'abord. int Type de données converties en long Type avant calcul.
- Toutes les opérations en virgule flottante sont effectuées avec une double précision,Même s'il n'y a que float Type,Aussi à convertir en double Type,Pour effectuer des calculs.
- char Et short Lors de la participation à l'opération,Doit être converti en int Type.
La figure ci - dessous illustre plus visuellement cette règle de conversion.:
unsigned C'est - à - dire unsigned int,Peut être omis pour le moment int,Écris seulement unsigned.
Exemple de conversion automatique de type :
#include<stdio.h>
int main(){
float PI = 3.14159;
int s1, r = 5;
double s2;
s1 = r * r * PI;
s2 = r * r * PI;
printf("s1=%d, s2=%f\n", s1, s2);
return 0;
}
Dans l'évaluation de l'expressionr*r*PI
Heure,r Et PI Sont convertis en double Type, Le résultat de l'expression est aussi double Type.Mais parce que s1 Entier, Donc le résultat de l'opération d'assignation reste entier ,J'ai laissé tomber la partie décimale, Cause de distorsion des données .
Forcer la conversion de type
La conversion automatique de type est le résultat de l'auto - évaluation du compilateur en fonction de l'environnement contextuel du Code , Parfois, ce n'est pas si “Intelligent”, Impossible de répondre à tous les besoins .Si nécessaire,Le programmeur lui - même peut également proposer explicitement dans son Code de faire une conversion de type,C'est ce qu'on appelle la conversion forcée de type.
La conversion automatique de type est silencieuse par le compilateur 、 Une conversion implicite de type , Il n'est pas nécessaire de l'incorporer dans le Code ; Le typage forcé est explicitement proposé par le programmeur 、 Une conversion de type qui doit être spécifiée par un code de format spécifique .En d'autres termes,, La conversion automatique de type n'exige pas l'intervention du programmeur , La conversion de type de force doit avoir une intervention du programmeur .
Le format de conversion de type forcé est: (type_name) expression
type_namePour le nouveau nom de type,expressionPour l'expression.Par exemple:
(float) a; //Variable variable a Convertir en float Type
(int)(x+y); //Mettez l'expression x+y Le résultat de int Taille
(float) 100; //Valeur numérique 100(Par défautintType)Convertir en float Type
Voici un exemple classique de conversion de type obligatoire :
#include <stdio.h>
int main(){
int sum = 103; //Total général
int count = 7; //Nombre
double average; //Moyenne
average = (double) sum / count;
printf("Average is %lf!\n", average); //Average is 14.714286!
return 0;
}
sum Et count Tous. int Type, Sans intervention ,Alorssum / count Le résultat de l'opération de int Type, La partie décimale sera jetée ;Bien que average - Oui. double Type, Peut recevoir des fractions décimales , Mais le cœur n'a pas assez de force , La partie décimale est avancée par “Castration”C'est, Il ne peut recevoir que des parties entières , Il en résulte une distorsion importante du résultat de la Division .
Puisque average - Oui. double Type,Pourquoi ne pas utiliser pleinement, Maximiser la précision des résultats de calcul ?Pour atteindre cet objectif,On va juste sum Ou count L'un d'eux est converti en double Type OK.Dans le code ci - dessus,On va sum Force à double Type,Voilà.sum / count Et le résultat sera double Type, Pour conserver la fraction décimale ,average Les valeurs reçues seront également plus précises .
Dans ce code,Il y a deux choses à noter.:
- Pour les opérations de division, Si le diviseur et le diviseur sont des entiers , Donc le résultat de l'opération est aussi un entier , La partie décimale sera jetée directement ; Si l'un des diviseurs et des diviseurs est décimal , Donc le résultat de l'opération est aussi décimal .
- ( )Priorité supérieure à/,Pour les expressions(double) sum / count,Sera exécuté en premier(double) sum,Oui. sum Convertir en double Type, Et puis la Division , C'est comme ça que ça se passe double Type, Capacité de conserver les fractions décimales . Attention à ne pas écrire (double) (sum / count), Le résultat de l'opération sera 3.000000, La partie décimale ne peut toujours pas être conservée .
La conversion de type n'est que temporaire
Qu'il s'agisse d'une conversion automatique de type ou d'une conversion forcée de type , Ce n'est qu'une transition temporaire pour cette opération , Le résultat de la conversion est également sauvegardé dans un espace mémoire temporaire , Ne change pas le type ou la valeur des données .Voir l'exemple ci - dessous:
#include <stdio.h>
int main() {
double total = 400.8; //Prix total
int count = 5; //Nombre
double unit; //Prix unitaire
int total_int = (int)total; //400
unit = total / count; // 80.160000
printf("total=%lf, total_int=%d, unit=%lf\n", total, total_int, unit); //total=400.800000, total_int=400, unit=80.160000
return 0;
}
Par le code ci - dessus,On peut voir,total Bien que le type ait été converti à total_int ,Maistotal Le type de données original n'a pas changé , Donc à la fin, c'était une décimale , Cela signifie que la conversion de type ne prend que du temps pour le calcul actuel
Conversion automatique de type VS Forcer la conversion de type
InCDans la langue,Certains types peuvent être convertis automatiquement,Vous pouvez également forcer la conversion,Par exemple int À double,float À int Attendez.;Certains types ne peuvent être forcés que,Impossible de convertir automatiquement,Par exemple, ce que vous apprendrez plus tard void * À int *,int À char * Attendez..
Les types qui peuvent être convertis automatiquement doivent pouvoir être forcés ,Mais,Les types qui nécessitent une conversion forcée ne peuvent pas nécessairement être convertis automatiquement.Les types de données que nous avons appris,Peut être converti automatiquement,On peut encore forcer,Plus tard, nous apprendrons des types qui ne peuvent être convertis que par la force et non automatiquement.
Les conversions de type qui peuvent être effectuées automatiquement sont généralement moins risquées,Sans conséquences graves pour la procédure,Par exemple,int À double Pas de défauts,float À int Au mieux, c'est une distorsion numérique.Les conversions de type obligatoires sont généralement plus risquées,Ou se comporter bizarrement.,Par exemple,char * À int * C'est un changement étrange.,Ce qui conduit à des valeurs étranges,Encore une fois.,int À char * C'est une transition très risquée,Cela provoque généralement un crash du programme. Lors de l'utilisation de la conversion de type de force,Les programmeurs eux - mêmes doivent être conscients des risques potentiels.
边栏推荐
- [BSP video tutorial] stm32h7 video tutorial phase 5: MDK topic, system introduction to MDK debugging, AC5, AC6 compilers, RTE development environment and the role of various configuration items (2022-
- Awk from entry to penetration (6) regular matching
- C语言-入门-基础-语法-[标识符,关键字,分号,空格,注释,输入和输出](三)
- Azure ad domain service (II) configure azure file share disk sharing for machines in the domain service
- go-zero微服务实战系列(九、极致优化秒杀性能)
- Turn: excellent managers focus not on mistakes, but on advantages
- C语言-入门-基础-语法-[主函数,头文件](二)
- 微服務入門:Gateway網關
- 2022 electrician (intermediate) examination question bank and electrician (intermediate) examination questions and analysis
- Comprendre la méthode de détection des valeurs aberrantes des données
猜你喜欢
From scratch, use Jenkins to build and publish pipeline pipeline project
Guanghetong's high-performance 4g/5g wireless module solution comprehensively promotes an efficient and low-carbon smart grid
Four essential material websites for we media people to help you easily create popular models
How to solve the problem that computers often flash
DM8 command line installation and database creation
Question 49: how to quickly determine the impact of IO latency on MySQL performance
ctfshow web255 web 256 web257
Snipaste convenient screenshot software, which can be copied on the screen
HMS core helps baby bus show high-quality children's digital content to global developers
Comparison between sentinel and hystrix
随机推荐
Four essential material websites for we media people to help you easily create popular models
DM8 database recovery based on point in time
FRP intranet penetration, reverse proxy
How to pass custom object via intent in kotlin
Awk from getting started to digging in (11) detailed explanation of awk getline function
Leetcode topic [array] - 121 - the best time to buy and sell stocks
awk从入门到入土(18)gawk线上手册
Bishi blog (13) -- oral arithmetic test app
What if I forget the router password
Li Kou today's question -1200 Minimum absolute difference
Guanghetong's high-performance 4g/5g wireless module solution comprehensively promotes an efficient and low-carbon smart grid
awk从入门到入土(6)正则匹配
System disk expansion in virtual machine
Use Alibaba cloud NPM image acceleration
一文了解數據异常值檢測方法
HMS core helps baby bus show high-quality children's digital content to global developers
Live in a dream, only do things you don't say
Go zero micro service practical series (IX. ultimate optimization of seckill performance)
Getting started with microservices: gateway gateway
Mouse over to change the transparency of web page image