2016-01-30 15 views
5
#include <stdio.h> 
int main() 
{ 
    int a=3,b=4,g; 
    a > b ? g = a : g = b ; 
    printf("%d",g); 
    return 0; 
} 

Tại sao giá trị của g không được in? Và trình biên dịch cho biết yêu cầu lvalue. Nó có nghĩa là gì?C ternary expression-statement không hoạt động

+1

Bạn đã thay đổi 'a> b? g = a: g = b; 'đến' g = a> b? a: b; 'hoặc' a> b? g = a: (g = b); ' – pouyan

Trả lời

15

Do ưu tiên cao hơn toán tử ?: qua =, khái niệm

a > b ? g = a : g = b; 

sẽ được phân tích như

(a > b ? g = a : g) = b; 

Khái niệm (a > b ? g = a : g) sẽ đưa ra một rvalue. Các toán hạng trái của chuyển nhượng (=) điều hành phải là một giá trị trái (sửa đổi ).

Thay đổi

a > b ? g = a : g = b ; 

để

a > b ? (g = a) : (g = b);  

hoặc

g = a > b ? a : b; 

. C11-§6.5.16/2: Một toán tử gán phải có một giá trị có thể sửa đổi làm toán hạng bên trái của nó.
. §6.3.2.1/1: Giá trị là một biểu thức (với loại đối tượng không phải là void) có khả năng chỉ định đối tượng; 64) nếu một lvalue không chỉ định một đối tượng khi nó được đánh giá, hành vi là không xác định. Khi một đối tượng được cho là có một kiểu cụ thể, kiểu được chỉ định bởi lvalue được sử dụng để chỉ định đối tượng. Giá trị có thể sửa đổi là một giá trị không có loại mảng, không có loại không đầy đủ, không có loại đủ điều kiện và nếu đó là cấu trúc hoặc công đoàn, không có bất kỳ thành viên nào (bao gồm, đệ quy, bất kỳ thành viên hoặc phần tử của tất cả các tập hợp hoặc tổ hợp có chứa) với loại đủ điều kiện.

+0

Có thể bạn vui lòng giải thích dòng của bạn: -" Toán hạng bên trái của toán tử = phải là một lvalue (có thể sửa đổi)." – sgewraks

+0

@sam; Đã thêm một số chi tiết về" lvalue "và' "lvalue có thể sửa đổi". – haccks

0
  • Chỉ cần thay thế của bạn:

    a > b ? g = a : g = b ; 
    

    với

    a > b ? (g = a) : (g = b) ; 
    
  • Vì precedance của ngoặc là higher.So nếu tình trạng a > b được trở thành hiện thực thì giá trị của một được gán cho g và nếu nó thất bại thì giá trị của b được gán cho g.

Các vấn đề liên quan