[Expérience de didacticiel de programmation en C] Questions pratiques de base (2) Les questions sujettes aux erreurs doivent être examinées plusieurs fois

Code 1 : opérateur - - || opérateur

Le résultat de l'exécution du programme suivant est :

//运行以下程序,输出结果是? 
#include <stdio.h>
int main()
{
    
    
	int a,b,c;
	a=1; b=2; c=3; 
	a=b--<=a||a+b!=c;//首先a取值应当为1或者0。
	//b--<=a 取值应为假,故为0;(2<1显然为假,)
	//a+b!=c 取值应为真,故为1;(1+1!=3显然对√)0||1 =1,故a=1。 
	printf("a=%d,b=%d\n",a,b); //故输出 a=1,b=1。 
} 

sortir:

La raison est expliquée dans les commentaires !
insérez la description de l'image ici

Code 2 : Conversion de type obligatoire telle que (int) (5.0/2), compréhension prioritaire

//运行以下程序的输出结果是? a=3 
#include <stdio.h>
int main()
{
    
    
	int a;
	a=(int)((double)(3/2)+0.5+(int)1.99*2);
	//首先a是整型的,所以0.5应该取整为0,又(double)(3/2)=1.500000,
	
	//对于(int)1.99*2,应该理解为,1.99取整为1,然后1*2=2
	
	//所以 a=1.5+2=3.500000,取整,所以a=3 
	printf("a=%d\n\n",a);  //a=3
	
	printf("----------------\n\n");
	printf("测试_1:(int)1.99*2 = %d\n\n",(int)1.99*2); //2
	printf("测试_1:(int)(1.99*2) = %d\n\n",(int)(1.99*2)); //3
	
	//由测试结果可知,(int)1.99*2 确实应该是先对1.99取整为1,再 1*2=2 
}

sortir:

Les commentaires sont très clairs !
insérez la description de l'image ici

Code 3 : Opérateur de conversion de type coercition

//求以下表达式的值 a=4
#include <stdio.h>
int main()
{
    
    
	int a;
	a=(int)((double)(5/2) + 2.5);
	//首先, (double)(5/2)=2.000000。因为5/2=2,又double,所以为2.000000
	//其次,2+2.5=4.5。取整,故a=4 
	printf("a=%d\n",a); // a=4
 } 

sortir:
insérez la description de l'image ici

Code 4 : Opérateurs d'auto-addition ++i et i++

//运行以下程序的输出结果是
#include <stdio.h>
int main()
{
    
    
	int i=8,j=9,m,n;
	m=++i; //m=9 i=9
	n=j++; //n=9 j=10
	printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n);
	//故 i=9,j=10,m=9,n=9 
	
 }

sortir:
insérez la description de l'image ici

Code 5 : Question prioritaire (les questions sujettes aux erreurs doivent être revues plusieurs fois)

 //易错题 
//运行以下程序的输出结果为: i=1,j=2,k=0 
#include <stdio.h>
int main()
{
    
    
	int k,i=0,j=2;
	k=i++ && j++ ; 

	//错误思路×××: 0 && 2,结果为假 取0,故k=0。之后,i和j再分别自加,故 i=1,j=3 
	//以上错误的原因是,把最终结果当成了 "k=多少?"
	 
	//正解√:&&作为分隔符,先算左边的,即先是k=i++,此时k=0,i=1,&&左边取值为0
	//由于 && 运算符,一假则假,故 (k=i++ && j++)取值即为0,
	//即 && 右边不执行,所以j仍然为原值,即j=2 
	printf("答案:i=%d,j=%d,k=%d\n\n",i,j,k);
	
	printf("------------------------------\n\n");
	//为便于测试,故重新定义变量q相当于k,同时i和j赋回原来的值。 
	int q; i=0,j=2; 
	
	printf("测试:\n\n");

	printf("(q=i++) && (j++)  = %d\n\n",(q=i++) && (j++)); //0
	
	printf("------------------------------\n\n");
	printf("继续测试:\n\n");
	int m; i=0,j=2;
	printf("m=i++取值为:%d\n",m=i++); //0
	printf("j++取值为:%d\n\n",j++);  //2
	
	printf("------------------------------\n\n");
	printf("再次测试:\n\n");
	int p; i=0;j=2;
	printf("p=i++ && j++  = %d\n",p=i++ && j++); //0 
	
}

sortir:

Pour cette question, veuillez combiner les trois tests suivants "Manger". Je "passais entre les mailles du filet" pendant le processus de test. À la fin, on peut voir que && est en fait utilisé comme séparateur. Tout d'abord, la valeur à gauche de && est calculée, c'est-à-dire k=0, i=1, et la valeur à gauche de && est 0 , donc le côté droit n'est plus calculé (le côté droit n'est pas exécuté), donc on obtient Le résultat de i=1, j=2, k=0 est obtenu. En fait, le résultat final de l'expression k=i++ && j++ ; est 0. ( 0 &&()=0)
Si l'ordre des opérations est faux, il est facile de faire des erreurs, tout comme la "mauvaise idée" écrite dans les commentaires.

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_44731019/article/details/123580384
conseillé
Classement