# 运算符

本文深入讲解Java中的二元运算符,包括加减乘除、取余等基本运算,以及整数和浮点运算的特点。同时,介绍了逻辑运算符、位运算符、扩展运算和三元运算符,并详细解释了各种运算符的使用场景和优先级。

运算符

在这里插入图片描述

二元运算

package operator;

public class Duality {
    public static void main(String[] args) {
        //二元运算符
        //ctrl+D:复制当前行到下一行
        int a = 10;
        int b = 20;
        int c = 25;
        int d = 25;
        System.out.println(a+b);//30
        System.out.println(a-b);//-10
        System.out.println(a*b);//200
        System.out.println(a/b);//0
        System.out.println(a/(double)b);//0.5
        System.out.println(a%b);//10 取余
        System.out.println("= =  == = = =  == = = = ");

        /*
        整数运算:
            如果两个操作数有一个为Long, 则结果也为long
            没有long时,结果为int。即使操作数全为shot,byte,结果也是int.
        浮点运算:
            如果两个操作数有一个为double,则结果为double.
            只有两个操作数都是float,则结果才为float.

        */
        long a1 = 123123123123123L;
        int b1= 123;
        short c1 = 10;
        byte d1 = 8;
        float f = 12.3f;
        double e = 123.123;
        System.out.println(a1+b1+c1+d1);// 123123123123264 long
        System.out.println(b1+c1+d1);//141 int
        System.out.println(c1+d1);//18 int
        //System.out.println((String)(c1+d1));//报错,int转String
        System.out.println(a1+b1+c1+d1+e);//1.2312312312338712E14 double
        System.out.println(a1+b1+c1+d1+f+e);//1.2312312283148312E14 double
        System.out.println(a1+b1+c1+d1+f);//1.23123123E14 float

        //幂运算:2^3  math类
        double p = Math.pow(2,3);//8.0
        System.out.println(p);
    }

}

package operator;
//逻辑运算符
public class Ternary {
    public static void main(String[] args) {
        // 与(&&/&) 或(||) 非(!)
        //短路运算 &&
        int c = 5;
        boolean d = (c<4)&&(c++<7);
        System.out.println(d);//false
        System.out.println(c);//5 没有执行c++操作
        //非短路运算 &
        int e = 5;
        boolean f = (e<4)&(e++<7);
        System.out.println(f);//false
        System.out.println(e);//6 执行c++操作

        //位运算
        /*
        *   A = 0011 1100
        *   B = 0000 1101
        * A&B = 0000 1100  按位与都1则1(两个都真1,则真1)
        * A|B = 0011 1101  按位或都0则0(有一个真1,则真,都假0则假0)
        * A^B = 0011 0001  按位异或不同则1,同则0(异则1)
        * `B  = 1111 0010  按位取反(0改1,1改0)
        *面试题:2*8怎么算快
        * 2*8 = 16  2*2*2*2
            << *2 左移n位,相当于乘以2^n
            >> /2 右移n位,相当于除以2^n
        * */
        System.out.println(2<<3);//16
        System.out.println(10>>3);//1
        //扩展运算
        int a = 10;
        int b = 20;
        a+=b;//a = a+b
        a-=b;//a = a-b
        System.out.println(a);//10

        //字符串连接符  + 两侧只要有一方为String类型,都转换成String连接
        System.out.println(""+a+b);//1020
        System.out.println(a+b+"");//30
        //System.out.println((int)(a+b+""));//30报错,Strin转int

        //三元运算符 x ? y:z
        int x= a<b ? a:b;
        System.out.println(x);//10
        int y = a<b ? b:a;
        System.out.println(y);//20

    }
}

优先级

参考链接:https://blog.youkuaiyun.com/pmcasp/article/details/78786966

<think>首先,用户的问题是关于C++宏定义的:"C++ macro definition # or ## operator should appear at most once per macro"。用户想知道在宏定义中,###运算符是否最多只能出现一次。这似乎是基于之前的对话或引用,用户提到了_codecheck工具。 回顾系统指令: - 所有行内数学表达式必须用$...$格式。 - 独立公式用$$...$$。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,如[^1]。 - 结构清晰,逐步解决问题。 - 参考提供的引用:[^1]和[^2]。 提供的引用: - [^1]: 讨论了#运算符在函数式宏中的使用,规则是:参数后跟#运算符时,会转换为字符串字面值,在宏扩展之前发生。 - [^2]: 讨论了可变参数宏,包括重命名__VA_ARGS__和移除悬空逗号。 用户意图:用户想确认在宏定义中,###运算符是否只能出现一次。引用中没有直接说这个限制,但用户提到了_codecheck工具,可能是一个代码检查工具。 我需要回答这个问题: - 核心问题:C++宏定义中,###运算符是否最多只能出现一次? - 根据C++标准,没有这样的限制。一个宏定义中可以多次使用###运算符。 - 例如,你可以写一个宏使用多个#运算符。 但用户提到"at most once",意思是"最多一次"。这可能是一个误解或特定工具的规则。 从引用中: - [^1] 展示了使用#运算符的例子:STR(s) #s,它使用了一次#。 - [^2] 讨论了可变参数宏,但没直接说###的限制。 实际上,在C++标准中,没有规定###只能出现一次。你可以有多个。 例如: ```cpp #define PRINT(a, b) #a #b ``` 这里有两个#运算符。 类似地,##用于连接: ```cpp #define CONCAT(a, b) a##b ``` 但可能在某些上下文或工具中,如_codecheck,可能有规则限制为一次,以避免复杂性或错误。 用户的问题:"should appear at most once per macro",所以是"应该"最多一次,不是"必须"。 在标准中,没有这样的要求。但最佳实践可能建议避免过多使用,因为它们可能使代码难读。 现在,构建回答: 1. 结构清晰:逐步解释。 2. 使用中文。 3. 引用末尾添加引用标识。 4. 生成相关问题。 回答大纲: - 先确认问题。 - 解释###运算符。 - 说明在C++标准中,没有限制只能出现一次。 - 给出例子。 - 提到如果使用_codecheck工具,可能有特定规则。 - 添加引用。 - 生成相关问题。 引用: - [^1] 解释了#运算符。 - [^2] 解释了可变参数宏,但不直接相关。 用户意图是了解使用限制,所以我需要基于标准回答。 最终回答: - 在C++中,每个宏定义可以使用多个###运算符,没有标准限制。但为了可读性,建议谨慎使用。</think>### C++宏定义中###运算符的使用限制 在C++宏定义中,#运算符(字符串化运算符)和##运算符(记号粘贴运算符)的使用规则主要基于C++标准(如C++11、C++17等)。关于您的问题:“###运算符是否在每个宏定义中最多只能出现一次?”——**答案是否定的,C++标准没有规定每个宏定义中###运算符只能出现一次**。一个宏定义中可以多次使用这些运算符,但需要遵循特定语法规则以避免错误。以下我将逐步解释: #### 1. **#运算符(字符串化运算符)的基本规则** - #运算符用于将宏参数转换为字符串字面值,转换发生在宏扩展之前[^1]。 - 示例:一个宏定义中多次使用#运算符是合法的。 ```cpp #define PRINT_VARS(a, b) std::cout << #a << " = " << a << ", " << #b << " = " << b; // 调用 PRINT_VARS(x, y) 会扩展为:std::cout << "x" << " = " << x << ", " << "y" << " = " << y; ``` 这里,#运算符出现了两次(#a和#b),但宏工作正常。 #### 2. **##运算符(记号粘贴运算符)的基本规则** - ##运算符用于连接两个记号(tokens),生成一个新记号。 - 示例:宏定义中多次使用##运算符也是允许的。 ```cpp #define CONCAT(a, b, c) a##b##c // 调用 CONCAT(var, _, 1) 会扩展为:var_1 ``` 这里,##运算符出现了两次(a##b和b##c),但符合标准。 #### 3. **C++标准中的限制** - C++标准(如ISO/IEC 14882)未限制###运算符的出现次数。但有以下关键规则: - #运算符只能应用于宏参数,不能用于其他部分(如字面值或表达式)。例如,`#42`是无效的[^1]。 - ##运算符必须生成有效的C++记号(token),否则会导致编译错误。例如,`a##+##b`是无效的,因为`+##`不是合法连接。 - 在可变参数宏中(使用`__VA_ARGS__`),###运算符可能有额外规则,例如##可用于移除悬空逗号[^2]。 - **常见误解**:某些代码检查工具(如_codecheck)可能建议“每个宏最多使用一次###”,但这并非C++标准要求,而是工具的最佳实践规则,旨在避免宏展开的复杂性和潜在错误。例如: - 过度使用##可能使代码难以调试。 - 在复杂宏中,多次使用###可能引发未定义行为(如记号冲突)。 #### 4. **实际建议** - **最佳实践**:尽管标准允许多次使用###,但建议每个宏限制在1-2次内,以提高可读性。例如: ```cpp // 推荐:每个宏只使用一次### #define STR(a) #a #define JOIN(a, b) a##b ``` - 如果必须多次使用,确保宏参数命名清晰,并测试宏展开结果。 - **工具相关**:如果您使用_codecheck等静态分析工具,它可能强制“最多一次”规则。请检查工具的文档,这通常是预防性规则,而非语言限制。 #### 5. **错误示例** - 无效用法(违反标准): ```cpp #define INVALID_STR(a, b) #a #b + 42 // 错误:#运算符后不能跟非参数内容 #define INVALID_CONCAT(a) a## // 错误:##后必须有记号 ``` - 有效但复杂(可能导致问题): ```cpp #define COMPLEX(a, b) #a ## #b // 合法但危险:可能生成无效字符串连接 ``` 总之,C++标准未强制###运算符在每个宏中最多出现一次,但过度使用可能引发维护问题。建议结合工具规则和代码可读性权衡[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值