short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确。为何?

本文详细解析了Java中的复合赋值表达式与简单赋值表达式的区别,特别是对于短整型变量进行复合赋值操作时可能出现的问题,并提供了具体的例子来说明。

       如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符。Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1的类型,除非E1只被计算一次。
   换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
   因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量。
因为S1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。   
     后面的那个不会发生类型的提升,JAVA规范上说    e1+=e2    实际上是    e1=(T1)(e1+e2),其中T1是e1的数据类型。   s1+=1等效于   s1=(short)(s1+1),所以是正确的。

 

 

转载:http://hi.baidu.com/lifa868/blog/item/b7c05b2bc6a97a91023bf6f3.html_腳步淩亂

### 解决 SFTP 登录时出现 `Permission denied (publickey)` 的问题 当遇到 Windows 使用 SFTP 登录 Linux 主机时提示 `Permission denied (publickey)` 错误,通常是因为公钥认证未正确配置或权限设置不恰当所致。以下是可能的原因分析以及解决方案: #### 1. **检查 SSH 配置文件** SSH 默认会尝试使用密钥验证身份。如果服务器端禁用了密码登录,则需要确保客户端提供了正确的私钥文件。 编辑 `/etc/ssh/sshd_config` 文件并确认以下参数已正确定义: ```bash PasswordAuthentication yes # 如果允许密码登录则启用此选项 PubkeyAuthentication yes # 启用基于公钥的身份验证 AuthorizedKeysFile .ssh/authorized_keys # 设置存储公钥的位置 PermitRootLogin no # 不推荐直接通过 Root 账号远程访问 AllowUsers sftptest # 明确指定哪些用户可以连接到 SFTP ``` 完成修改后重启服务使更改生效: ```bash systemctl restart sshd ``` 上述操作适用于大多数发行版系统[^1]。 #### 2. **验证用户的家目录及其权限** 对于新创建的 `sftptest` 用户来说,其主目录应具有适当的安全属性以免被其他进程干扰。具体命令如下所示: - 创建必要的子文件夹供上传下载数据存放; - 将这些共享区域赋予所属组写入能力的同时保持根路径只读状态; 实际执行过程如下: ```bash mkdir -p /home/sftptest/{get,put} chown root:sftptest /home/sftptest/ chmod 755 /home/sftptest/ chown sftptest:sftptest /home/sftptest/get /home/sftptest/put ``` 这一步骤有助于防止潜在越权行为发生同时满足基本功能需求。 #### 3. **处理 SELinux 对于 SFTP 影响** 某些情况下即使完成了以上调整仍无法正常工作可能是由于启用了强制模式下的SELinux策略阻止了相应动作的发生。可以通过临时放宽规则来测试是否存在关联影响: 运行下面这条指令永久开启 home 目录作为 SAMBA 共享支持的功能开关(仅针对 RHEL/CentOS 类型环境有效),或者干脆关闭整个机制以便进一步排查问题根源所在。 ```bash setsebool -P samba_enable_home_dirs on # 推荐方式之一 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config && setenforce Permissive # 另一种替代方案 ``` 注意后者会使整体安全性下降因此除非必要否则不应长期维持这种状况[^2]。 #### 4. **生成与分发 SSH 密钥对** 假如仍然坚持采用 Key-Based Authentication 方法代替传统的 Password Method ,那么就需要先在本地机器上生产一对新的 RSA/ECC 私钥和对应的公开部分再将其复制粘贴至目标主机对应账户内的特定位置下形成绑定关系。 以 PowerShell 中为例演示如何实现这一流程: ```powershell # Step A: Generate Keys On Client Side Under C:\Users\<YourAccount>\.ssh\ ssh-keygen.exe -t rsa -b 4096 -C "your_email@example.com" # Step B: Transfer Public Part To Remote Host Via Secure Channel Like SCP Or Manual Copy&Paste Into Target User's Home Directory As '.ssh\authorized_keys' scp ~/.ssh/id_rsa.pub username@hostname:/tmp/ # Then Login With Non-root Account And Move File Appropriately After Connecting Through Standard Means First Time Around. mv /tmp/id_rsa.pub ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys ; restorecon -Rv ~/.ssh/ ``` 最后记得再次校验所有涉及环节是否都遵循最佳实践标准从而彻底消除隐患. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值