1. 程式人生 > >賦值表示式的值等於右值

賦值表示式的值等於右值

複製程式碼
 1 #include <stdio.h>
 2 
 3 int main(int argc, const char *argv[])
 4 {
 5     int i;
 6     //當賦值為0時賦值表示式代表的邏輯值為假,所以下列語句不會執行
 7     if (i=0) {
 8         printf("i=0\n");
 9     }
10     //當賦值為非0時賦值表示式代表的邏輯值為真,所以下列語句會執行
11     if (i=1) {
12         printf("i=1\n");
13     }
14     //當賦值為非0時賦值表示式代表的邏輯值為真,所以下列語句會執行
15 if (i=-1) { 16 printf("i=-1\n"); 17 } 18 //逗號表示式代表的邏輯值為最後一個表示式的邏輯值,所以下列語句不會執行 19 if (i=1,i=0) { 20 printf("i=1,i=0\n"); 21 } 22 //逗號表示式代表的邏輯值為最後一個表示式的邏輯值,所以下列語句會執行 23 if (i=0,i=1) { 24 printf("i=0,i=1\n"); 25 } 26 27 28 29 return 0; 30 }

賦值表示式的值為何總是右值而不是左值?

我估計,按賦值表示式的語意,等號的左邊總是“可寫”的,右邊總是“可讀”的。如果賦值表示式的值是左邊的值,那麼程式需要重新計算等號左邊的值才能返回,這帶來兩個問題,一是效能,二是左邊的物件不一定可讀(例如那些可寫但不可讀的屬性)。於是,幾乎所有語言都將“所賦的值”作為賦值語句的返回值,所以連續賦值語句的行為總是“計算最右值一次,從右向左賦值多次”。

但是,對於coffee的解構賦值表示式,情況則有點不同,因為coffee必須將該表示式拆分成兩個,當c是一個包含副作用的屬性時,a=b=c 和 b=c;a=c; 並不是等價的。所以,對於解構賦值表示式,等號右邊的表示式實際將會求值多次。

相關推薦

表示式等於

1 #include <stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 int i; 6 //當賦值為0時賦值表示式代表的邏輯值為假,所以下列語句不會執行 7 if (i=0) { 8

常量指針不能作為給非常量指針

賦值 () using ret 一個 常量指針 err invalid 限定符 #include<iostream> using namespace std; int main(){ int b[4]={1,2,3,4}; const int*

從規範看表示式的解析

從一道常見的面試題開始: var a = {n: 1}; var b = a; a.x = a = a.y = {n: 2}; console.log(a.x); console.log(b.y); 複製程式碼 顯然,關鍵點在於最後一個語句的執行。這個語句的執行主要涉及了 屬性獲取表示式 和 賦值表示式,先

C++基礎知識(二)--左--邏輯表示式優化--逗號運算子與表示式

一、C++左值右值概念   左值:c++將變數名代表的單元稱為左值,而將變數的值稱為右值,左值必須是記憶體中可以訪問且可以合法修改的物件,因此只能是變數名,而不能是常量或表示式。即左值可以定址。   右值:將變數的值稱為右值,由運算操作(加減乘除,函式呼叫返回值等)所產生的中間結果(沒有名字的結果)稱為右

C++基礎知識(二)--左--邏輯表達式求優化--逗號運算符與表示式

-- 沒有 加減乘除 p s 能夠 表示 操作 逗號 因此 一、C++左值右值概念   左值:c++將變量名代表的單元稱為左值,而將變量的值稱為右值,左值必須是內存中可以訪問且可以合法修改的對象,因此只能是變量名,而不能是常量或表達式。即左值可以尋址。   右值:將變量的值

Java表示式

思考:賦值表示式有值嗎?答案是肯定的。來看例子: int a=3; System.out.println(a=10);//輸出10 int b=4; int c=5; Sys

14.C++11 新標準:foreach、引用&&、lambda表示式、語言級別的執行緒與鎖

關鍵字和新語法 1、delete      指定刪除類的成員方法         在類的成員方法後面寫  = delete  就將該成員方法刪除,使用者無法呼叫。 智慧指標unique_ptr就是將物件的拷貝構造和operator=  delete刪除了 2、auto

初始化與 宣告與定義

左值既能在賦值的左邊,又能在右邊。 右值只能在右邊。  (++a  是左值  a++是右值); a+1:取變數a的記憶體中的值,然後相加 b = a;把a記憶體中的值拷貝到b的記憶體中 初始化:建立變數並給它賦初始值。 賦值:擦出物件的當前值並用新值替代。 int a(

表示式 表示式(C/C++)

何謂物件? 這裡所說的物件是廣義上的,而不僅僅是狹義的類/物件(class/object)。 在C/C++中,所謂的物件指的是執行環境中一塊儲存區域(a region of storage),該儲存區域中的內容則代表了該物件的值(value)。注意到我們這裡所說的"

關於JAVA中表示式及型別轉換

short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯? short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(shor

表示式(C++學習)

左值右值是表示式的屬性,該屬性稱為 value category。按該屬性分類,每一個表示式屬於下列之一: lvalue left value,傳統意義上的左值 xvalue expiring value, x值,指通過“右值引用”產生的物件

C++11的引用

右值引用 語法 factor htm 類型 har start 移動 hand 右值引用是C++11 引入的新特性。它解決了兩類問題:實現移動語義和完美轉發。本文大絕大部分內容,來自於文章:http://kuring.me/post/cpp

mssqlserver分區表的左

int cti index hat func 進行 following 一個表 code 參考官方文檔: https://docs.microsoft.com/zh-cn/sql/t-sql/statements/create-partition-function-tra

C語言 左

16px 不能 操作 b- 存在 text 記錄 右值 i++ 左值就是在賦值中可以放在賦值操作符兩邊的值 右值則是只可以放在賦值操作符右邊的值 ++i是直接給i變量加1,然後返回i本身,因為i是變量,所以可以被賦值,因此是左值表達式i++現產生一個臨時變量,記錄i的值,而

C++ 引用與移動操作

銷毀 帶來 臨時對象 類型 左值引用 都是 獲得 留下 c++11 右值引用和移動操作是C++11提出的新概念,通過這些操作,可以降低拷貝操作帶來的消耗。先來簡單介紹一下左值和右值。 左值一般指的是一個對象,或者說是一個持久的值,例如賦值的返回值、下標操作、解引用以及前置遞

第15課 引用(2)_std::move和移動語義

可見 div 強制轉換 let 技術分享 移動語義 ptr align 講解 1. std::move (1)std::move的原型 template<typename T> typename remove_reference<T>::type&

引用和引用

開發 左值 優化 語法 表達 3.2 右值 實現 規則 1、左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值;左值必須要在內存中有實體; 右值當在賦值號右邊取出值賦給其他變量的值;右值可以在內存也可以在CPU寄存器。

引用、左

nbsp 簡單 strong 自定義 表達式 產生 指針類型 == int 我的理解   引用是一個左值,而常量引用是一個右值。兩者最關鍵的地方在於,左值可以被取到地址,而右值取不到地址,這個性質就決定了右值不能在 “=” 的左側。   從匯編角度去理解這個問題的話,

C++左引用和引用

分配內存 右值 markdown type 提高 指向 區分 基本語法 down 1.左值和右值概念: 左值是可以放在賦值號左邊可以被賦值的值:左值就是指在表達式使用完之後仍存在的對象(存儲空間); 右值當在賦值號右邊去除值賦給其他變量的值:右值可以在內存也可以在CPU寄存

從4行代碼看引用

ESS 重載函數 內存 auto 復制代碼 默認 ins lba var 看到的文章,覺得很不錯,保留一下,不知是不是原文的地址:https://www.cnblogs.com/qicosmos/p/4283455.html 從4行代碼看右值引用 概述   右值引用的概