三元运算符的运算级别&&......

前言(情境引入)

继续来分享编程遇到的小问题。

购买甲乙两种商品预算共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,而是-1i!因此,我断定,三元运算符的优先级高于逗号一整个三元运算符只对应一个位置(替换符)。

OK,现在前十五行都没问题了,就是最后一行。。, x x x为什么会是 0 0 0呢?
我经过试错,发现0不能作为被模数。可以试一下在编译器中输入cout<<0%2;是会报错的。而在运行的时候,C(兼C++)会直接跳过报错语句,然后程序就直接输出了占位符的默认值——0。


总结

  1. 三元运算符的优先级高于逗号;一整个三元运算符只对应一个位置(替换符),不能一次性对应多个替换符。
  2. 0不能作为被模数。
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值