10.以下程序段中,不能实现“如果a<b则x=10,否则x=-10”的是______。 A. if(a<b) x=10; if(b<a) x=-10; B. if(a<b) x=10; else x=-10; C. x=-10; if(a<b) x=10; D. x=(a<b):10?-10; 标准答案:A
时间: 2024-04-02 12:31:42 浏览: 174
选项A中,两个if语句之间没有联系,如果a<b成立,x会被赋值为10,然后又会进入第二个if语句,因为此时b<a不成立,所以x不会被赋值为-10,因此无法实现“如果a<b则x=10,否则x=-10”。而选项B中,使用了if-else语句,当a<b成立时,x被赋值为10,否则x被赋值为-10,可以实现题目要求。选项C中,先将x赋值为-10,然后再进行判断,如果a<b成立,x会被重新赋值为10,可以实现题目要求。选项D中,使用了条件运算符,当a<b成立时,x被赋值为10,否则x被赋值为-10,可以实现题目要求。因此,正确答案是A。
相关问题
#include<stdio.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #include<string.h> typedef struct _test{ int a_val; int b_val; int a_flag; int b_flag; int game_no; int stage; }test; int pk[3][3] = {0,-1,1,1,0,-1,-1,1,0}; void sem_p(); void sem_v(); void set_sem(); void del_sem(); int sem_id; union semun{ int val; struct semid_ds *buf; unsigned short *arry; }; int main(){ int shmid; test* shm; shmid = shmget((key_t)1236,sizeof(test),0666|IPC_CREAT); if(shmid == -1){ printf("shmget failed\n"); exit(EXIT_FAILURE); } printf("%d",shmid); shm = shmat(shmid,0,0); if (shm == (void*)-1){ printf("shmat failed\n"); exit(EXIT_FAILURE); } printf("\nMemory attached at %X\n",(int)shm); sem_id = semget((key_t)3000,1,0666|IPC_CREAT); set_sem(); int no=0,debug=0,a,b; shm->a_flag=0; shm->a_val = -2; shm->b_flag=0; shm->b_val = -2; shm->game_no=1; shm->stage=0; while(1){ sem_p(); //printf("a:%d b:%d\n",shm->a_val,shm->b_val); sleep(1); if(shm->game_no==-1){ sem_v(); break; } if (shm->stage==0){ if(no!=shm->game_no){ no = shm->game_no; printf("-------------------\n"); printf("game_no:%d\n",no); } if(shm->a_flag==1 && shm->b_flag==1) shm->stage=1; } else if(shm->stage==1){ printf("a:%d\n",shm->a_val); printf("b:%d\n",shm->b_val); a = pk[shm->a_val][shm->b_val]; b = pk[shm->b_val][shm->a_val]; shm->a_val=a; shm->b_val=b; shm->a_flag=0; shm->b_flag=0; shm->stage=2; } else if(shm->stage==2){ if(shm->a_flag==1 && shm->b_flag==1){ shm->stage=0; shm->game_no++; shm->a_flag=0; shm->b_flag=0; printf("-------------------\n"); if(shm->game_no > 100) shm->game_no=-1; } } sem_v(); } shmdt(shm); int ret=0; ret = shmctl(shmid,IPC_RMID,NULL); if(ret<0){ printf("shmctl error!\n"); } del_sem(); printf("finish"); } void set_sem(){ union semun sem_union; sem_union.val=1; semctl(sem_id,0,SETVAL,sem_union); } void del_sem(){ union semun sem_union; semctl(sem_id,0,IPC_RMID,sem_union); } void sem_p(){ struct sembuf sem_b; sem_b.sem_num = 0; sem_b.sem_op = -1; sem_b.sem_flg = SEM_UNDO; semop(sem_id,&sem_b,1); } void sem_v(){ struct sembuf sem_b; sem_b.sem_num = 0; sem_b.sem_op = 1; sem_b.sem_flg = SEM_UNDO; semop(sem_id,&sem_b,1); }
这段代码是一个使用共享内存和信号量实现的石头剪刀布游戏程序。程序中创建了一个共享内存区域,用于存储游戏的状态和玩家的选择结果。同时,使用了一个信号量来控制共享内存的访问,防止多个进程同时修改共享内存的内容。
具体来说,程序中定义了一个结构体test,用于存储游戏的状态和玩家的选择结果。其中包括两个整型变量a_val和b_val,分别表示玩家A和玩家B的选择,-2表示未做出选择;a_flag和b_flag,表示玩家A和玩家B是否已经做出选择,0表示未做出选择,1表示已做出选择;game_no,表示当前游戏的轮数;stage,表示游戏的阶段,0表示等待玩家做出选择,1表示计算结果,2表示等待下一轮游戏开始。
在主函数中,程序首先创建了一个共享内存区域,然后使用shmat函数将共享内存映射到本进程的地址空间中。接着,创建了一个信号量,用于控制共享内存的访问。程序采用了PV操作,即sem_p和sem_v函数,来实现对信号量的操作。
程序进入死循环,在循环中不断检查共享内存的状态。如果游戏轮数已经超过100轮,则结束游戏,否则等待玩家做出选择。如果两个玩家都已经做出选择,则计算结果,并等待下一轮游戏开始。
最后,使用shmdt函数将共享内存从本进程的地址空间中分离,使用shmctl函数删除共享内存区域,使用del_sem函数删除信号量。
#include <stdio.h> int main() { int x=10,y=9,a,b,c; a=(--x==y++)?--x:++y; b=x++; c=y; printf("a=%d,b=%d,c=%d\n",a,b,c); return 0; }
这段C程序定义了一个简单的三元运算符表达式,用来更新`x`和`y`的值并存储结果到变量`a`, `b`, 和`c`中。让我们逐步分析:
首先,`(--x == y++)` 是一个条件语句,它首先递减`x`(`--x`),然后检查是否等于递增后的`y`(`y++`)。如果相等,则执行第一个分支,否则执行第二个分支。
1. 如果`(--x == y++)`为真(即`x`小于`y`并且它们都减少后相等):
- `--x` 减少`x`的值(现在的`x`为9)
- 不改变`y`,因为条件不成立
2. 如果`(--x == y++)`为假(即`x`至少大于`y`或两者相等但`x`先被减少):
- 不改变`x`,因为`y`会增加(现在的`y`为10)
- `++y` 增加`y`的值
因此,根据初始值`x=10`和`y=9`,`(--x)`会变为`9`,`y++`会变为`10`,所以`(--x == y++)`会为假。因此,不会执行`--x`,而是执行`++y`,使得`y`变为`11`。
接下来是执行`a`, `b`, 和 `c` 的赋值:
- `a = ++y` 将`y`增加1(现在的`y`为11),所以`a`为11。
- `b = x++` 先使用当前的`x`(10),然后`x`自增(现在的`x`为11),因此`b`为10。
- `c = y` 直接把`y`的最新值(11)赋给`c`。
最后的`printf`语句输出的结果将是:
```
a=11, b=10, c=11
```
阅读全文