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();

更新

由于您有TextAction 作为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:向Notes添加从右到左的语言

C语言中同等级运算的先后顺序

C语言十六进制转换成十进制:要从右到左用二进制的每个数去乘以16的相应次方

C语言输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位).

将一个正整数从右到左按位输出 求c语言程序

关于《翁恺 程序设计入门》视频笔记