前言(情境引入)
继续来分享编程遇到的小问题。
购买甲乙两种商品预算共48元(每种商品至少买一件),甲商品(x)每件4元,乙商品(y)每件3元,则有____种购买方。
就是很简单又有点麻烦的题, 可是我就怕麻烦, 所以就 偷偷 打开了devcpp for computer,然后······。
正文
出问题的代码
# include <iostream>
int main (){
for (int i=1; i<=16; ++i) printf("x=%d, y=%d \n", (48-i*3)%4 ? -1, -1: (48-i*3)/4, i);
return 0;
}
先来浅浅的解释一下代码思路:既然总共 48 48 48元,那么乙商品的件数的取值范围为 0 < y < 16 , ( y 为整数 ) 0<y<16,(y为整数) 0<y<16,(y为整数)(假设全买乙商品,那么最多买 48 ÷ 3 = 16 48 \div 3 = 16 48÷3=16件商品,但是这样甲商品的件数就为 0 0 0了,所以乙商品的最大取值小于 0 0 0),于是就遍历一边乙商品的件数的所有可能,然后再在遍历中判断此时 x x x是否成立,如果成立就输出甲商品、乙商品的件数,否则就输出 − 1 -1 −1。
可是我运行之后是这样的:
x=-1, y=1
x=-1, y=2
x=-1, y=3
x=9, y=4
x=-1, y=5
x=-1, y=6
x=-1, y=7
x=6, y=8
x=-1, y=9
x=-1, y=10
x=-1, y=11
x=3, y=12
x=-1, y=13
x=-1, y=14
x=-1, y=15
x=0, y=16
当三元运算符中判断条件不成立时,输出的不是两个-1
,而是-1
和i
!因此,我断定,三元运算符
的优先级高于逗号
;一整个三元运算符只对应一个位置(替换符)。
OK,现在前十五行都没问题了,就是最后一行。。,
x
x
x为什么会是
0
0
0呢?
我经过试错,发现0不能作为被模数。可以试一下在编译器中输入cout<<0%2;
是会报错的。而在运行的时候,C(兼C++)会直接跳过报错语句,然后程序就直接输出了占位符的默认值——0。
总结
- 三元运算符的优先级高于逗号;一整个三元运算符只对应一个位置(替换符),不能一次性对应多个替换符。
- 0不能作为被模数。