c语言中条件运算 结合方向 从右到左 啥意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中条件运算 结合方向 从右到左 啥意思相关的知识,希望对你有一定的参考价值。
RT 看的时候不是从左往右看的么
运算符的结合方向(顺序)决定了计算的顺序。条件运算符(? :)的结合方向是从右到左,也即运算符的匹配顺序是从右往左的。
下面举例说明结合顺序从右到左的含义:
int a=1, b=3, c=2, d;d = a>b ? a : c>b ? c : b;
// 根据从右到左的结合顺序,则该表达式等价于d = (a>b ? a : (c>b ? c : b));
// 计算过程:
// 1、先算a>b,结果为0;
// 2、再算(c>b ? c : b),之后算c>b,结果为0,
// 3、所以最后结果为b的值,也即等于3
// 如果是从左到右的结合顺序,那么该表达式等价于d =((a>b ? a : c>b) ? c : b);
//计算过程:
// 1、先算a>b,结果为0;
// 2、再算c>b,结果为0;
// 3、所以d=b,结果为b的值,也即等于3
ps:虽然计算结果相同,但是计算的顺序是完全不同的。
参考技术A 在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。 但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式: int a,b=1,c=2; a=b=c; 我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2.类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。 参考技术B 在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。 但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式: int a,b=1,c=2; a=b=c; 我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2.类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。 参考技术C 从左到右扫描,从右往左计算。 比如一个赋值语句,a=b;首先从b地址取数据,然后写到a地址。所以是从右到左计算。 参考技术D 从左到右扫描,从右往左计算。 比如一个赋值语句,a=b;首先从b地址取数据,然后写到a地址。所以是从右到左计算。从右到左 SnackBar
【中文标题】从右到左 SnackBar【英文标题】:Right To Left SnackBar 【发布时间】:2016-05-17 01:29:02 【问题描述】:我想在 Design Support Library SnackBar 上显示带有 动作 的 文本。 我的语言是从右到左书写的。那么如何更改 SnackBar 文本和操作方向? 像这样的:
【问题讨论】:
【参考方案1】:只有你需要:
Snackbar snackbar=Snackbar.make(v, "آیا از حذف کامل این مورد مطمئن هستید؟", Snackbar.LENGTH_LONG)
.setAction("حذف", new View.OnClickListener()
@Override
public void onClick(View v)
//info@giran.ir
//09155336168
);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
View snack = snackbar.getView();
snack.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
snackbar.show();
【讨论】:
【参考方案2】:最后从答案和更多搜索中我找到了这个解决方案:
Snackbar snackbar =
Snackbar.make(view, "My right2left text", Snackbar.LENGTH_LONG)
.setAction("Action", new View.OnClickListener()
@Override
public void onClick(View view)
);
将方向设置为从右到左:
ViewCompat.setLayoutDirection(snackbar.getView(),ViewCompat.LAYOUT_DIRECTION_RTL);
不要忘记显示小吃栏:
snackbar.show();
更新
由于您有Text
和Action
作为TextView
,您可以为它们使用其他TextView 方法。比如setTypeface()
、setTextSize()
等等。
为文本设置字体:
TextView text = snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
text.setTypeface(yourTypeface);
为动作设置字体:
TextView action = snackbar.getView().findViewById(android.support.design.R.id.snackbar_action);
action.setTypeface(yourTypeface);
【讨论】:
对 17 岁以下的 android 使用 android.support.v4.view.ViewCompat 中的 ViewCompat 如***.com/questions/30463608/…。 简单实用【参考方案3】:private void showSnackbar(String text, int Length, String Action, View.OnClickListener clickListener)
Snackbar snackbar = Snackbar.make(findViewById(R.id.coordinatorLayout), text, Length);
View snack = snackbar.getView();
snackbar.getView().setRotationY(180);
snack.setBackgroundColor(getResources().getColor(R.color.DarkBlue));
TextView snack_text = (TextView)snack.findViewById(android.support.design.R.id.snackbar_text);
TextView snack_action = (TextView)snack.findViewById(android.support.design.R.id.snackbar_action);
snack_text.setTypeface(tf);
snack_action.setTypeface(tf);
snack_action.setRotationY(180);
snack_text.setRotationY(180);
snackbar.setAction(Action, clickListener);
snackbar.setActionTextColor(Color.parseColor("#00c4ff"));
snackbar.show();
【讨论】:
请解释您的代码如何以及为什么解决问题,因为 *** 不接受纯代码的答案。此外,您可以解释为什么您的答案超过了以前的旧答案(主要是已接受的答案)。【参考方案4】:只需添加此代码:
在应用程序标签下的Android清单中保留此
android:supportsRtl="true"
还有这个:
Snackbar snackbar = Snackbar.make(getView(), "Text", Snackbar.LENGTH_SHORT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
TextView view1 = (TextView)snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
view1.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
snackbar.show();
【讨论】:
好的,但是当您想为您的应用程序使用 RTL 方向时,它很有用。在某些情况下,您希望对应用使用 LTR 方向,对某些小部件使用 RTL。【参考方案5】:我通过根据这个参考为小吃布局设置自定义布局解决了这个问题。
customize snackBar's layout
【讨论】:
【参考方案6】:您必须根据本地进行设置。 Android 支持此功能。
从 Android API Level 17+ 开始,它原生支持 RTL。要强制您的整个布局为 RTL,包括 ActionBar,请执行以下操作。
在应用程序标签下的Android清单中保留此
android:supportsRtl="true"
在 Utils 类中定义这样的方法
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static void getRtlSupport()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
将此 repo 用作参考并将其用于小吃店
https://github.com/semsamot/ActionBarRTLizer.git
【讨论】:
谢谢,那么 API 级别 17- 呢?我的应用最小 SDK 为 14。 这不是最佳做法。避免 RTL 语言爱好者在 Android 应用程序开发中发生奇怪事情的更好方法是创建自定义 RTL 布局并在应用程序的每个位置进行扩展,例如具有自定义 RTL 布局的工具栏在每个 API 中比选择 Android RTL Support 并强制布局为 RTL 具有更好的性能。所以这是我的经验。感谢耐心的读者以上是关于c语言中条件运算 结合方向 从右到左 啥意思的主要内容,如果未能解决你的问题,请参考以下文章
C语言十六进制转换成十进制:要从右到左用二进制的每个数去乘以16的相应次方